【问题标题】:how to write a junit test to see what is returned?如何编写junit测试以查看返回的内容?
【发布时间】:2015-01-07 16:02:44
【问题描述】:

对编写单元测试非常陌生。 有人可以帮我写一个测试吗

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;

我想知道哪些东西适合测试和一个简单的指南,以便我将来学习。此外,我真的很想知道如何查看 domainList 是否返回。 是 assertTrue 吗?

【问题讨论】:

  • 查看link
  • 你可以使用 assertNotNull(list);
  • 你不应该在这里测试的一件事是map(...,...)。这需要在一个单独的测试中

标签: java junit


【解决方案1】:

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

  1. 测试如果您输入一个空列表,是否会返回一个空列表。
  2. 测试如果您输入一个非空列表,是否会返回一个具有相同数量元素的列表。
  3. 测试如果您输入具有已知值的非空列表,结果是否包含看起来像是您期望的映射值的值。 不要测试映射本身;这应该在 map 函数的单独测试中完成。
  4. 测试阴性案例,例如将null 传递给函数。

可以帮助您完成这些任务的方法是:

【讨论】:

    【解决方案2】:

    我鼓励您先尝试考虑要测试的结果,然后编写一些代码以使测试通过 (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);
    }
    

    所以,如果我从代码向后工作到测试,我想我会想要按照这些思路进行测试。想想快乐的道路,还有你的边缘情况,比如当你传递 null 时应该发生什么,等等。这有意义吗?希望对您有所帮助!

    【讨论】:

    • 在许多情况下,为每个测试运行创建一个新的TestSubject 是有意义的;毕竟,它可能持有一种状态,这会使一个测试影响另一个测试。
    • 同意@blalasaadri。但是,我不确定我所说明的行为是否与以使用 at-Before 注释的方法实例化测试对象存在重大差异。好吧,无论如何,只是想在这里传达这个想法。
    • 在@Before-Method 中初始化它应该也能正常工作。为了简单起见,在方法中初始化它可能是个好主意;这可能会使 OP 避免出现奇怪的错误,并且很容易理解。
    • 为了说明的目的,在测试方法中实例化测试对象中的对象就可以了。然而,明显的缺点是下一个面临此示例的编码员可能会滥用复制/粘贴。也试图保持测试“干燥”。
    【解决方案3】:

    看起来domainList 总是会被返回,因为你只是在mapToDomainList 方法中创建了一个新的。所以你需要用assertFalse(returnedDomainList.isEmpty());之类的东西检查它是否不为空 如果entityList 不为空,这将起作用。

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

    【讨论】:

    • 所以如果 entityList 不为空,测试会失败吗?无论结果如何,如何编写两次都通过?
    • @BlackMagma 你应该有两个测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2022-11-04
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多