Java 如何编写junit测试以查看返回的内容?

Java 如何编写junit测试以查看返回的内容?,java,junit,Java,Junit,对编写单元测试来说非常陌生。 有人能帮我写一个测试吗 public List<PspTransaction> mapToDomainList(List<PspTransactionEntity> entityList) { List<PspTransaction> domainList = new ArrayList<PspTransaction>(); for (PspTransactionEntity entit

对编写单元测试来说非常陌生。 有人能帮我写一个测试吗

public List<PspTransaction> mapToDomainList(List<PspTransactionEntity> entityList) {
        List<PspTransaction> domainList = new ArrayList<PspTransaction>();
        for (PspTransactionEntity entity : entityList) {
            domainList.add(map(entity, new PspTransaction()));
        }
        return domainList;
公共列表映射到域列表(列表entityList){
List domainList=新建ArrayList();
for(PspTransactionEntity实体:entityList){
添加(映射(实体,new PspTransaction());
}
返回域名列表;
我想知道哪些东西是好的测试和一个简单的指南,这样我可以为未来学习。此外,我真的想知道如何看看域名列表是否返回。
它是assertTrue吗?

看起来总是会返回
domainList
,因为您只是在
mapToDomainList
方法中创建了一个新的域列表。因此您需要使用类似
assertFalse(returnedDomainList.isEmpty())的内容检查它是否为空;
如果
entityList
不为空,则此操作有效


如果
entityList
为空,您可以断言返回的列表也是空的。

一般来说,您可以在这里测试几件事情

  • 测试如果输入空列表,是否会返回空列表
  • 测试如果输入非空列表,是否返回具有相同元素数的列表
  • 测试如果输入了一个包含已知值的非空列表,结果中是否包含看起来像您期望的映射值的值。但不要测试映射本身;这应该在对
    映射
    函数的单独测试中完成
  • 测试阴性情况,例如将
    null
    传递给函数
  • 帮助您完成这些任务的方法包括:

    • 以及注释(当然,您可以将
      ExpectedException
      替换为您期望的异常类型)

    我鼓励您尝试先考虑要测试的结果,然后编写一些代码使测试通过(TDD)。这可以帮助您开发良好的接口和设计易于理解的类,甚至可以重复使用

    这里有两条经验法则,你希望你的类有一个责任,你的方法做一件事——本质上,这是KISS原则,但有一些具体的设计提示。此外,我喜欢考虑行为测试而不是方法测试——这是一个微妙的区别,我会发现很难解释

    这里我有一个方法要测试,在我考虑我真正打算让系统做什么之前,所以我发现这样做比较困难,但我会分享我的想法。我喜欢使用AssertJ断言..我只是在做这个,所以它没有看到编译器

    import static org.assertj.core.api.Assertions.*;
    ...
    
    private TestSubject testSubject = new TestSubject(); // instance of the class under test (you omit the actual class name)
    ...
    
    @Test
    public void should_return_empty_list() {
        // Arrange
        List<PspTransactionEntity> input = new ArrayList<PspTransactionEntity>();
    
        // Act
        List<PspTransaction> mapResult = testSubject.mapToDomainList(input);
    
        // Assert
        assertThat(mapResult.size()).isEqualTo(0);
    }
    
    @Test(expected=java.lang.NullPointerException.class)
    public void should_throw_null_pointer_exception() {
        // Act
        List<PspTransaction> mapResult = testSubject.mapToDomainList(null);
    }
    
    import static org.assertj.core.api.Assertions.*;
    ...
    private TestSubject TestSubject=new TestSubject();//被测类的实例(省略实际类名)
    ...
    @试验
    public void应该返回空列表(){
    //安排
    列表输入=新的ArrayList();
    //表演
    List mapResult=testSubject.mapToDomainList(输入);
    //断言
    assertThat(mapResult.size()).isEqualTo(0);
    }
    @测试(预期为java.lang.NullPointerException.class)
    public void应该\u抛出\u null\u指针\u异常(){
    //表演
    List mapResult=testSubject.mapToDomainList(空);
    }
    

    因此,如果我从代码向后到测试,我想我会希望沿着这些路线进行测试。想想快乐的路径,还有你的边缘案例,比如当你通过null时会发生什么,等等。这有意义吗?希望有帮助!

    选中此项你可以使用assertNotNull(列表);你不应该在这里测试的一件事是
    map(…,…)
    。这需要在一个单独的测试中,这样如果entityList不为空,测试将失败?如何编写它以通过两次测试,而不管结果如何?@BlackMagma您应该有两个测试。在许多情况下,为每个测试运行创建一个新的
    TestSubject
    是有意义的;毕竟,它可能会保持一个状态,这将使一个测试生效ence另一个。同意@blalasaadri。我不确定我所说明的行为是否与用at-Before注释的方法实例化测试主题有实质性的不同。好吧,无论如何,我只是想在这里传达这个想法。在@Before方法中初始化它也应该起作用。为了保持简单,最好不过,在方法中初始化它;这可能会避免OP出现奇怪的错误,并且很容易理解。为了便于说明,在测试方法中实例化测试主题中的对象是可以的。然而,明显的缺点是,下一个面临此示例的编码人员可能会滥用复制/粘贴EST也是“干”的。