如何对创建新对象的类进行单元测试

Fun*_*key 6 java junit unit-testing mockito

我正在使用JUnit和Mockito来测试一些类.该类本身从另一个类创建一个对象.一个名为testList的列表.这是我的代码:

public class A {
       private List<B> bList;

       //returns the bList
       public List<B> getBList() {
          return bList;
       }

       //checks the status by calling getStatus in class B
       public Status getStatus() {
          //status is an enum consists of PASSED and FAILED
          Status finalStatus = Status.PASSED;
          for (B be : this.getTestList()) {
             if (be.getStatus() != Status.PASSED) {
                finalStatus = Status.FAILED;
                break;
             }
          }
          return status;
       }
    }


    public Class B {
       private Status status = Status.FAILED;   

       public getStatus() {
          return status;
       }

       public void setStatus(Status status) {
          this.status = status;
       }
    }
Run Code Online (Sandbox Code Playgroud)

在名为Test的类中测试getStatus和getTestList方法的最佳方法是什么.

非常感谢你....

Daw*_*ica 4

我看着你ClassA,想知道如何bList设置任何东西。现在,除了 null 之外没有其他办法,这意味着getStatus每次都会抛出空指针异常。

你的问题是你正在考虑如何测试方法而不是考虑如何测试行为。这是一个问题的原因之一是您的类必须以某种方式与应用程序的其余部分相适应。为了确保它做到这一点,它需要特定的行为,而不是每个方法中的特定细节。因此,唯一有意义的测试是检查行为的测试。

也许更阴险的是,测试单个方法会让您专注于您实际上编写的代码。如果您在编写测试时查看代码,那么您的测试就会成为一个自我实现的预言。您可能错过了您的班级需要提供的一整套行为;但如果您只测试您的类确实提供的行为,您永远不会知道。

那么,回到手头的问题。我看到你的班级可能需要实现四种,也许五种行为。也许还有更多 - 如果您只向我们展示代码而不是规范,则很难判断。您应该为每个测试编写一个测试。我坚信每个测试的名称应该描述行为,而不是反映测试使用的方法的名称。在这种情况下,我可能会选择这样的名字。

public void statusIsPassedWhenEveryTestPassed()
public void statusIsFailedWhenEveryTestFailed()
public void statusIsFailedWhenSomeTestsPassedSomeFailed()
public void statusIsPassedWhenNoTests()
public void statusIsPassedWhenTestsNotSet() // this one currently fails
Run Code Online (Sandbox Code Playgroud)

在每个测试中,我将创建一个 的对象ClassA,然后执行任何必须执行的操作来设置该bList对象内的 。最后,我会调用getStatus并断言返回值就是我想要的。但重要的一点是,每个测试(除了最后一个)都使用多个方法ClassA,因此这些不是单个方法的测试。