Java DTO的单元测试
测试getter和setter是否合适和必要Java DTO的单元测试,java,unit-testing,dto,Java,Unit Testing,Dto,测试getter和setter是否合适和必要 我认为它们没有任何逻辑,也不能崩溃或抛出任何异常。您不应该对DTO的getter和setter进行单元测试,除非它们包含一些需要测试的复杂逻辑。此函数不会更改此字符串的任何内容。。。 -->没有复杂的二传手 setTest(String test) { this.test = test; } 但是如果您有类似的东西,那么测试它是有意义的(因为可能有人更改了令牌,例如): 如果生成了getter和setter的代码,我认为它是正确的。这是在语言
我认为它们没有任何逻辑,也不能崩溃或抛出任何异常。您不应该对DTO的getter和setter进行单元测试,除非它们包含一些需要测试的复杂逻辑。此函数不会更改此字符串的任何内容。。。 -->没有复杂的二传手
setTest(String test) {
this.test = test;
}
但是如果您有类似的东西,那么测试它是有意义的(因为可能有人更改了令牌,例如):
如果生成了getter和setter的代码,我认为它是正确的。这是在语言级别没有属性的一个主要缺点——您有很多生成的代码,这些代码都签入到源代码管理中,并且应该进行测试,因为它在覆盖率报告中会发出红色的尖叫声 另一方面,即使是简单的getter也可能不正确,例如由于C&p错误:
private String foo;
private String bar;
String getFoo() {return foo;}
String getBar() {return foor;}
我的最后一个想法是:当测试使用getter和setter的适当逻辑时,会隐式地测试它们。测试中未包括设定器?-可能您从未设置此字段,它可能是最终字段?只有二传手但没有传接手无用字段?出于以下几个原因,您可能需要/被迫对getter和setter进行单元测试:
1. <代码>代码覆盖范围 2. <代码>自动回归测试 在这些情况下,您可以使用生成这些junit测试用例的库,或者,使用泛型编写单个实用程序方法来设置对象,将其取回并比较它们是否相等。我现在正在阅读,作者建议您不要为«值对象»(例如DTO)编写测试用例
为了报道本身的报道永远都不是好的,正如卡尔·塞根所说 使用现代工具不需要太多努力:
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanConstructor;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanEquals;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanHashCode;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanToString;
import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
public class Test {
@Before
public void setUp() throws Exception {
}
@Test
public void testFlatFileReaderMetadata_Parameters() throws Exception {
assertNotNull(new Test());
assertThat(Test.class, allOf(hasValidBeanConstructor(), hasValidBeanEquals(), hasValidGettersAndSetters(),
hasValidBeanHashCode(), hasValidBeanToString()));
}
}
静态代码分析应该能够发现未使用的字段和所有这些内容,我认为不需要进行单元测试。如果DTO使用自动转换机制,比如from
ModelMapper
,我不确定。我有一些测试失败,因为它没有正确映射所有内容。当问题存在于DTO中时,搜索一个测试的缺陷可能会很烦人。此外,您可以将@paraperizedtest
与几个类一起使用,如@ValueSource
,而我完全同意“为了覆盖而覆盖永远不会好”,这不是这个问题的内容。测试DTO类并不意味着不相信语言能够正确地将数据移入和移出DTO类。这是关于不信任未来的开发人员能够维护类的“DTO契约”。所谓“DTO契约”,我的意思是“每个getter应该总是返回提供给其相应setter的最新值”。“但是,嘿,拜托!没有人会在DTO中加入一些“逻辑”并打破它,是吗?”是的,他们会。
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanConstructor;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanEquals;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanHashCode;
import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanToString;
import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
public class Test {
@Before
public void setUp() throws Exception {
}
@Test
public void testFlatFileReaderMetadata_Parameters() throws Exception {
assertNotNull(new Test());
assertThat(Test.class, allOf(hasValidBeanConstructor(), hasValidBeanEquals(), hasValidGettersAndSetters(),
hasValidBeanHashCode(), hasValidBeanToString()));
}
}