Java Mockito:用不同的方法覆盖mock值

Java Mockito:用不同的方法覆盖mock值,java,junit,mockito,Java,Junit,Mockito,根据您发布的内容,我建议对第一个方法使用'Mockito.when()'方法,然后设置obj=null如@Seelenvirtuose所示。如果这不起作用,您可能希望传入另一个初始化为null的模拟对象。参见示例。最简单的方法是使用两个测试类而不是一个测试类,因为当它执行您的测试方法时,已经太迟了,因为模拟已经被注入(除非您使用应避免的refection) 第一次测试 if (obj != null) { //perform some actions } 如果您只想使用

根据您发布的内容,我建议对第一个方法使用'Mockito.when()'方法,然后设置
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());
    }
}