gpt4 book ai didi

java - 如何对此进行单元测试(使用模拟或经典单元测试?)

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:10 24 4
gpt4 key购买 nike

我需要为以下方法(简化)编写一个 JUnit 测试:

/** Return name of previous entry or name of given entry if no previous entry. */
public String getPreviousName(TreeEntry entry) {
if (entry.getPrevious() != null) {
return entry.getPrevious().getName();
} else {
return entry.getName();
}
}

我只是不知道该如何测试。我也可以

a) 使用 Mocks 模拟出参数及其先前的条目或

b) 创建一个真正的 TreeEntry 并且它是真正的前一个条目

使用模拟的问题是,我需要在测试用例中说明实际实现需要使用哪种方法,例如在这里我说正确的名称是通过 TreeEntry 的 getPrevious() 获得的,然后是通过前一个条目的 getName() 获得的(不考虑 if null 的情况,因为这基本上不是问题):

TreeEntry mockEntry = mock(TreeEntry.class);
TreeEntry mockPreviousEntry = mock(TreeEntry.class);
when(mockEntry.getPrevious()).thenReturn(mockPreviousEntry);
when(mockPreviousEntry.getName()).thenReturn("testName");

assertEquals("testName", classUnderTest.getPreviousName(mockEntry));

但是实现者也可以像这样实现它:

return NameService.getName(entry.getPrevious());

这对测试来说无关紧要。

但是,如果我使用没有模拟的经典单元测试,我会遇到另一个问题。 TreeEntry 的构造函数非常复杂。它有 5 个需要有效对象的参数。所以创建类似这样的东西非常复杂:

TreeEntry entry = new TreeEntry(...);
TreeEntry previousEntry = new TreeEntry(...);
entry.setPrevious(previousEntry);
previousEntry.setName("testName");

assertEquals("testName", classUnderTest.getPreviousName(entry));

代码会比这长得多,因为构造函数采用复杂的参数。另一件事是构造函数访问文件系统以从那里加载它的内容,因此它增加了单元测试的速度。

使用经典方法,它还将测试更多地与 TreeEntry 的实现联系起来。因为如果使用构造函数或前一个条目的设置在 TreeEntry 中更改了某些内容,则它也需要在测试中进行更改。如果忘记它,即使被测类不是 TreeEntry,也会导致测试失败。

您认为对此进行单元测试的正确方法是什么?

我个人更喜欢模拟方法。是否可以说在测试用例中我已经指定了哪些是被测类的协作者,因为在某种程度上这也更多地属于设计而不是实现?

最好的问候,亚历克斯

最佳答案

我认为您的模拟方法看起来很好(我同意如果 TreeEntry 像您说的那样复杂,您不应该将它们混合到这些测试中(但我希望您这样做 在别处测试 TreeEntry))。如果你正在编写很多这样的测试,你应该考虑使用一些构建器模式(如果你有耐心的话,使用流畅的语法),这样你就可以构建模拟,例如像这样:

BuildANew.TreeEntry().WithPreviousEntryName("testName");

或者您可以创建一个 ITreeEntry 接口(interface)并根据该接口(interface)编写您的树操作代码,并创建一个简单的 stub 实现以传递到您的测试中,这样您就不需要弄乱模拟设置代码。或者,为了更简洁的方法,创建接口(interface)模拟它。

关于java - 如何对此进行单元测试(使用模拟或经典单元测试?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5148278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com