Java Mockito:用不同的方法覆盖mock值
根据您发布的内容,我建议对第一个方法使用'Mockito.when()'方法,然后设置Java Mockito:用不同的方法覆盖mock值,java,junit,mockito,Java,Junit,Mockito,根据您发布的内容,我建议对第一个方法使用'Mockito.when()'方法,然后设置obj=null如@Seelenvirtuose所示。如果这不起作用,您可能希望传入另一个初始化为null的模拟对象。参见示例。最简单的方法是使用两个测试类而不是一个测试类,因为当它执行您的测试方法时,已经太迟了,因为模拟已经被注入(除非您使用应避免的refection) 第一次测试 if (obj != null) { //perform some actions } 如果您只想使用
obj=null代码>如@Seelenvirtuose所示。如果这不起作用,您可能希望传入另一个初始化为null的模拟对象。参见示例。最简单的方法是使用两个测试类而不是一个测试类,因为当它执行您的测试方法时,已经太迟了,因为模拟已经被注入(除非您使用应避免的refection)
第一次测试
if (obj != null) {
//perform some actions
}
如果您只想使用一个测试类进行测试,这仍然是可能的,但更像是一种黑客行为,因为您需要一种非传统方法的条件注入,因此您需要使用MockitoAnnotations.initMocks(obj)
以编程方式注入mock
与直接将模拟注入测试类不同,我们需要依赖于将包含或不包含字段obj
的包装类,如果不存在,则不会注入任何内容,因此它将为null
,否则将注入模拟
@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());
}
}
公共类TestInjectMocks{
/**
*将由包装类实现的小接口
*仅用于获取主类
*/
公共接口测试配置{
SomeClass getSomeClass();
}
@试验
public void dependency shouldbenotnull(){
//此类将允许获取SomeClass的实例
//注入磁场后
TestConfig obj=newtestconfig(){
@嘲弄
私有对象;
@注射模拟
私有类mainObj;
@凌驾
公共SomeClass getSomeClass(){
返回mainObj;
}
};
initMocks(obj);
SomeClass mainObj=obj.getSomeClass();
//这里我需要SomeDependency obj的一个值
assertEquals(2,mainObj.method());
}
@试验
public void dependency shouldbenull(){
//此类将允许获取SomeClass的实例
//没有注入磁场
TestConfig obj=newtestconfig(){
@注射模拟
私有类mainObj;
@凌驾
公共SomeClass getSomeClass(){
返回mainObj;
}
};
initMocks(obj);
SomeClass mainObj=obj.getSomeClass();
//这里我需要一些依赖项obj为null
assertEquals(1,mainObj.method());
}
}
NB:正如我们所说的MockitoAnnotations.initMocks(obj)
显式地,注释@RunWith(MockitoJUnitRunner.class)
不再需要了。obj=null代码>?@Seelenvirtuose我试过了,它不起作用设置obj=null
不起作用,如果你想设置obj==null
???你应该多解释一下你想要什么。事实上,这个问题非常不清楚。啊,我现在明白了,您希望在SomeClass
对象中对SomeDependency
的引用为null
。当然,在测试类中设置obj=null
不会改变这一点。那么,如何设置依赖关系呢?在构造函数中?然后用null
值调用该构造函数。还是在二传中?然后用null
值调用setter即可。@seelenVirtuse非常感谢!这会很好,但我没有任何构造函数或setter,也没有使用@injectmock
并手动执行正确的注入:)
if (obj != null) {
//perform some actions
}
@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());
}
}
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());
}
}