2016-05-03 33 views
1

Java方法看起来像下面的JUnit是由一个布尔标志

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测试类下面的代码驱动的Java方法:

String responseXML = xyzPayment.generateResponseXML(Errors); 

一点也没有当successResponse需要成立时,不会覆盖代码。如何覆盖successfulResponse为true的代码,而只覆盖else部分。请在这里指导我如何实现代码覆盖率?

回答

1

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

如果您需要能够在测试中设置此变量,但不想为其公开setter,则可以将其设置为私有包(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); 
+0

谢谢,我居然改变了访问修饰符对公众和它为我工作。 – user2967948

1

只需设置successfulResponse字段设置为true在您的测试

即使字段是priate你仍然可以将它设置为true使用反射:

Field successfulResponseField = YourClass.class.getDeclaredField("successfulResponse"); 
successfulResponseField.setAccessible(true); 
successfulResponseField.set(yourClassInstance, true); 
+0

这是一个合理的答案,但应警告新手使用反射是一种测试气味。 – slim

+0

虽然这种方法是可能的,但它有点肮脏,我不会推荐它,除非你真的**需要严格关于私人领域。 – Chill

+0

即使该字段应该是私人的,如果它不能通过公共接口(可能间接)设置,它应该不存在。 – slim

1

我得假设successfulResponse是一个字段。你没有告诉我们该领域是如何设置的。您的测试需要调用任何方法集successfulResponsetrue

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

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

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

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

有几个方法,你可能找到设定字段的对象:

  • 直接,如果它是公共字段:myObj.field = true
  • 通过方法调用,例如,二传手myObj.setField(true)
  • 构造,如图
  • 静态工厂方法MyClass myObj = MyClass.successfulInstance()
  • (及以上)

因为你是一个编写测试,它很可能你的改写被测试的课程 - 所以最多可以知道该字段存在的原因,以及它如何设置。

1

如果你想测试方法不改变您的实现,您可以使用类似:

MyClass myTestingClass = new MyClass() { 
    @Override 
    public String generateResponseXML(List<Error> parsingErrors) throws XMLStreamException 
    {   
     successfulResponse = true; 
     super.generateResponseXML(parsingErrors); 
    }}; 
myTestingClass.generateResponseXML(Errors); 
相关问题