可以在单个测试 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
注释方法中,您甚至可以通过调用构造函数来实例化对象。这意味着这些对象(objAWithIsEnableAsTrue
和 objAWithIsEnableAsFalse
)甚至不会在您的测试中被模拟。
为了使您的测试更加清晰,我建议您将测试的设置逻辑移至测试方法本身。
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?
我有一个 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
注释方法中,您甚至可以通过调用构造函数来实例化对象。这意味着这些对象(objAWithIsEnableAsTrue
和 objAWithIsEnableAsFalse
)甚至不会在您的测试中被模拟。
为了使您的测试更加清晰,我建议您将测试的设置逻辑移至测试方法本身。
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?