1

Java 方法如下所示

 public String generateResponseXML(List<Error> parsingErrors)
                throws XMLStreamException {


            Map<String, String> additionalNamespaces = new HashMap<String, String>();
            if (successfulResponse){
            additionalNamespaces.put(
                    ServiceInterface.COMMON_NAMESPACE_PREFIX,
                    ServiceInterface.COMMON_NAMESPACE);
            additionalNamespaces.put(
                    ServiceInterface.COMMON_NAMESPACE_PREFIX,
                    ServiceInterface.COMMON_NAMESPACE);
            }
            else {
                additionalNamespaces.put(
                        ServiceInterface.NAMESPACE_PREFIX,
                        ServiceInterface.NAMESPACE);
                additionalNamespaces.put(
                        ServiceInterface.NAMESPACE_PREFIX,
                        ServiceInterface.NAMESPACE);
            }

当我在 Junit Test 类中编写以下代码时:

String responseXML = xyzPayment.generateResponseXML( Errors );

当successfulResponse 需要为真时,它不包括代码。如何覆盖successfulResponse 为真的代码,而不是只覆盖else 部分。请指导我如何在这里实现代码覆盖率?

4

4 回答 4

1

所以,成功响应是一个成员变量,对吧?

如果您需要能够在测试中设置此变量,但又不想为其公开设置器,则可以将其设为包私有(https://docs.oracle.com/javase/tutorial/java/ javaOO/accesscontrol.html )。然后你会让你的测试类与你正在测试的类具有相同的包。

所以这个类会有类似的东西:

public class MyClass {
    boolean successfulResponse = false;
    //code ...
}

那么你的测试会是这样的:

xyzPayment.successfulResponse = true;
String responseXML = xyzPayment.generateResponseXML( Errors );
于 2016-05-03T16:22:01.050 回答
1

只需successfulResponse在测试中将该字段设置为 true

即使该字段是私有的,您仍然可以将其设置为true使用反射:

Field successfulResponseField = YourClass.class.getDeclaredField("successfulResponse");
successfulResponseField.setAccessible(true);
successfulResponseField.set(yourClassInstance, true);
于 2016-05-03T16:22:17.417 回答
1

我不得不假设这successfulResponse是一个领域。您还没有向我们展示该字段是如何设置的。您的测试将需要调用任何设置successfulResponsetrue.

例如,它可能发生在构造函数中:

public MyClass(boolean successful) {
    this.successfulResponse = true;
}

在这种情况下,您的测试需要以这种方式调用构造函数:

MyClass xyzPayment = new MyClass(true);
String responseXML = xyzPayment.generateResponseXML(errors);

有几种方法可以获取带有字段集的对象:

  • 直接,如果它是一个公共领域:myObj.field = true
  • 通过方法调用,例如 settermyObj.setField(true)
  • 构造函数,如图
  • 静态工厂方法MyClass myObj = MyClass.successfulInstance()
  • (和更多)

由于您是编写测试的人,因此您似乎可能是编写被测类的人——因此需要知道该字段为何存在以及如何设置。

于 2016-05-03T16:27:11.397 回答
1

如果您想在不更改实现的情况下测试该方法,您可以使用以下内容:

MyClass myTestingClass = new MyClass() {
    @Override
    public String generateResponseXML(List<Error> parsingErrors) throws XMLStreamException 
    {         
        successfulResponse = true;
        super.generateResponseXML(parsingErrors);
    }};
myTestingClass.generateResponseXML(Errors);
于 2016-05-03T16:34:53.690 回答