@RunWith(MockitoJUnitRunner.class)
public class Test {
@Mock
private SomeDependency<T> obj;
@InjectMocks
private SomeClass mainObj;
@Test
public void dependencyShouldBeNotNull() {
//here I need one value of SomeDependency obj
assertEquals(2, mainObj.method())
}
@Test
public void dependencyShouldBeNull() {
//here I need SomeDependency obj to be null
assertEquals(1, mainObj.method())
}
主要课程:
class SomeClass {
private SomeDependency<T> field;
public int method() {
if(field==null)
return 1;
else
return 2;
}
}
我的问题:如何根据不同的方法需要覆盖mock的值?
被修改 在主要的SomeClass中我有这样的代码:
if (obj != null) {
//perform some actions
}
答案 0 :(得分:1)
最简单的方法是使用2个测试类而不是1个测试类,因为当它执行测试方法时已经太晚了,因为模拟已经被注入(除非你使用了应该避免的反射)。
第一次测试
@RunWith(MockitoJUnitRunner.class)
public class Test1 {
@Mock
private SomeDependency<T> obj;
@InjectMocks
private SomeClass mainObj;
@Test
public void dependencyShouldBeNotNull() {
//here I need one value of SomeDependency obj
assertEquals(2, mainObj.method());
}
}
第二次测试
@RunWith(MockitoJUnitRunner.class)
public class Test2 {
@InjectMocks
private SomeClass mainObj;
@Test
public void dependencyShouldBeNull() {
//here I need SomeDependency obj to be null
assertEquals(1, mainObj.method());
}
}
如果你只想用一个测试类来实现它,它仍然是可能的,但它更像是一个黑客,因为你想要一个不是传统方法的条件注入,所以你需要以编程方式注入模拟{ {1}}。
我们需要依赖包含或不包含字段MockitoAnnotations.initMocks(obj)
的包装类,而不是直接将模拟注入到测试类中,如果不存在,则不会注入任何内容,因此它将是obj
否则你会注射一个模拟。
null
注意:当我们明确调用public class TestInjectMocks {
/**
* Small interface that will be implemented by the wrapper classes
* only used to get the main class
*/
public interface TestConfig {
SomeClass getSomeClass();
}
@Test
public void dependencyShouldBeNotNull() {
// This class will allow to get an instance of SomeClass
// with the field injected
TestConfig obj = new TestConfig() {
@Mock
private SomeDependency<T> obj;
@InjectMocks
private SomeClass mainObj;
@Override
public SomeClass getSomeClass() {
return mainObj;
}
};
MockitoAnnotations.initMocks(obj);
SomeClass mainObj = obj.getSomeClass();
//here I need one value of SomeDependency obj
assertEquals(2, mainObj.method());
}
@Test
public void dependencyShouldBeNull() {
// This class will allow to get an instance of SomeClass
// without the field injected
TestConfig obj = new TestConfig(){
@InjectMocks
private SomeClass mainObj;
@Override
public SomeClass getSomeClass() {
return mainObj;
}
};
MockitoAnnotations.initMocks(obj);
SomeClass mainObj = obj.getSomeClass();
//here I need SomeDependency obj to be null
assertEquals(1, mainObj.method());
}
}
时,不再需要注释MockitoAnnotations.initMocks(obj)
。
答案 1 :(得分:0)
根据您发布的内容,我建议对第一种方法使用'Mockito.when()'方法,然后将@ obj = null;
设置为@Seelenvirtuose建议。如果这不起作用,您可能希望传入一个初始化为null的不同Mocked out对象。请参阅this示例。