如何在注入的@Mock类中使用thenReturn()?

时间:2018-10-19 10:00:26

标签: java junit dependency-injection mockito

在Mockito测试用例中,将BClass注入AClass。我想为b.doSomething()定义一个返回值,该返回值将在a.askBSomething()中调用。

但是,我的AClass没有构造函数,因此我无法在单元测试中将b传递给a。有没有解决方法?

@RunWith(MockitoJUnitRunner.class)
public class AClassTest {
    @Mock
    BClass b;

    @InjectMocks
    AClass a = new AClass();

    @Before
    public void setUp() throws Exception {
        when(b.doSomething()).thenReturn("something");
    }

    @Test
    public void test() {
        assertTrue(a.askBSomething());
    }
}

public class AClass {

    @Inject
    private BClass b;

    public boolean askBSomething() {
        String result = b.doSomething(); // result will be null instead of "something"
        //.....  
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

是的,有。
您可以在调用AClass的c'tor之后使用反射在AClass中设置模拟。

只需添加以下方法,然后在setUp()中调用它即可。

private void setMockB(AClass objectA, BClass mockB)
{
    Field bField = AClass.class.getDeclaredField("b");
    bField.setAccessible(true);
    bField.set(objectA, mockB)
}

或者,您可以为b添加一个公共设置器,然后在setUp()中调用它。