[英]Junit test for model class
这个问题是关于最佳实践而不是任何问题。 我正在尝试测试下面的服务方法。 myDAO 是 DAO class,它将被注入并具有所有数据库调用代码。
public List<MyObject> getMyObject(String inputParameter){
List<MyObject> objectList = myDAO.getObjectList(inputParameter);
return objectList
}
而我的 Junit 测试用例使用 mockito 是
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest{
@InjectMocks
MyClass myClass;
@Mock
MyDAO myDAO;
private MyObject myObj;
private List<MyObject> objList;
@Before
public void setUp() throws Exception {
myObj = new MyObject();
myObj.setQuantity(10);
//I am calling all setter method to prepare myObj here
objList = new ArrayList<MyObject>();
objList.add(myObj);
when(myDAO.getObjectList(any(InputParameter.class))
.thenReturn(objList);
}
@Test
public void testGetMyObject(){
List<MyObject> result = myClass.getMybject(null);
assertThat(" Quantity should return 10", result.getQuantity(), is(10));
// and all asserts....
}
一切都很好并且工作正常。 我这里的主要问题是 MyObject 是一个带有 200 个参数的模态 class。
现在为了代码覆盖,我必须在准备对象时调用 200 个 setter 方法,并断言 200 个 getter 方法用于 junit 测试。 我认为这不是一个好主意。 什么是更好的做法以及如何在单元测试代码覆盖率上覆盖这种模式 class。
1)在单个类中定义的200个字段意味着真正的设计问题。
即使是模型类也没有拥有这么多领域。
2)你的测试实际上没有测试。
您的测试的单一逻辑是:
List<MyObject> objectList = myDAO.getObjectList(inputParameter);
但你嘲笑DAO的调用。
最后,您只测试getter / setter方法。
我认为以单一的观点测试这个类并不是很重要。
您应该在集成测试的框架中测试此类,其中DAO不会被模拟。
此外,如果您从顶层测试它,您还可以使用更简洁的方法来设置测试的固定,因为客户端类不会填充所有这些单一数据。
例如,它可以从fixture SQL脚本提供。
关于编写单元测试用例的最佳实践一直存在巨大争议。 所以对于这类问题,不会有明确的答案。 对我来说,为getter和setter编写测试用例只是为了使代码覆盖百分比高是愚蠢的。 但有时您的选择和您的偏好不计算在内。
尽管您的代码需要重构,但您可以使用一些API来简化您的工作。 SmartUnit就是其中之一,您可以使用它来测试您的POJO。 这些API允许您只在场景后面编写几行,覆盖所有getter / setter代码覆盖率。
为什么不直接使用 lombok 来生成 getter/setter 样板代码。 这样您就不必担心 POJO 类的覆盖百分比。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.