繁体   English   中英

Junit 测试 model class

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM