可以在单个测试 class 中使用 class 的多个模拟吗?

Can multiple mocks of a class be used in a single test class?

我有一个 class:

classA
{
    private Boolean isEnable;

    private final Config config;

    public classA(final Config config)
    {
        this.config = config;
        isEnable = config.getEnablingStatus();
    }

    public classB fun()
    {
        // Do something!
        // Return an object of classB!
    }
}

我想在两种不同的情况下测试方法 fun() - 一种情况下 isEnable 为真,另一种情况下这是假的。

所以,为了做到这一点,我正在考虑在其测试中使用 classA 的 2 个不同实例 class:

TestClassForClassA
{
    private Boolean isEnable;
    
    @Mock
    private final Config config;
   
    @InjectMocks
    classA objAWithIsEnableAsTrue, objAWithIsEnableAsFalse;

    @Before
    public void init() 
    {
        initMocks(this);
    }

    public void testFunWhenIsEnableIsTrue()
    {
        doReturn(true).when(config).getEnablingStatus();
        objAWithIsEnableAsTrue = new classA(config);
        // Use the objAWithIsEnableAsTrue object in this test method.
    }

    public void testFunWhenIsEnableIsFalse()
    {
        doReturn(false).when(config).getEnableStatus();
        objAWithIsEnableAsFalse = new classA(config);
        // Use the objAWithIsEnableAsFalse object in this test method.
    }
}

这样可以吗?如果不是,正确的方法是什么?

这不是您所写问题的答案,但我想这可能是您需要的答案:

从您发布的代码来看,没有理由模拟 classA。在 @Before 注释方法中,您甚至可以通过调用构造函数来实例化对象。这意味着这些对象(objAWithIsEnableAsTrueobjAWithIsEnableAsFalse)甚至不会在您的测试中被模拟。


为了使您的测试更加清晰,我建议您将测试的设置逻辑移至测试方法本身。

TestClassForClassA {

    @Test
    public void testFunWhenIsEnableIsTrue(){
        Config config = mock(Config.class);
        doReturn(true).when(config).getEnableStatus();

        classA objAWithIsEnableAsTrue = new classA(config);
        // Use the objAWithIsEnableAsTrue object in this test method.
    }

    @Test
    public void testFunWhenIsEnableIsFalse(){
        Config config = mock(Config.class);
        doReturn(false).when(config).getEnableStatus();

        classA objAWithIsEnableAsfalse = new classA(config);
        // Use the objAWithIsEnableAsTrue object in this test method.
    }
}

此外,您应该检查是否真的需要模拟 Config 对象。它也可以被实例化而没有副作用吗?如果是的话,我会这样做以摆脱整个嘲笑。

Config config = new Config(); 
config.setEnablingStatus(true); // maybe do this instead of mocking?