如何在一种方法中编写UT来模拟内部对象?

2022-09-04 20:28:27

例如,我有一个java类,如下所示。我将为doWork()编写一个单元测试,所以我想控制obj的行为。但很明显,obj 是在内部实例化的。

我该如何编写此UT?现在我正在使用Junit + Mockito。

class ToBeTest{
    public ToBeTest(){}
    public boolean doWork(){
        OtherObject obj=new OtherObject();
        return obj.work();
    }
}

提前致谢。:)

顺便说一句,现实是我正在为其他人的课程编写UT。所以我不想改变它。它已通过集成测试进行了全面测试。


答案 1

如果你无法更改代码,你可以使用Powermock以及junit和Mockito来模拟新对象的构造。

@Test
public void testDoWork() throws Exception{

    MyTest mytest = new MyTest();

    OtherObj obj = new OtherObj();
    obj.test="mocked Test"; //here you can add any other needed values to obj

    PowerMockito.whenNew(OtherObj.class).withNoArguments().thenReturn(obj);

    String result = mytest.doWork();
    Assert.assertTrue(result.equalsIgnoreCase("mocked Test"));
}

答案 2

最好的方法是编写代码来支持测试测试驱动开发强调这一点)。目前,您的代码的编写方式使其难以测试。

请考虑使用依赖关系注入,因为它可以帮助您模拟依赖对象。


推荐