Mockito:用不同的方法覆盖模拟值

时间:2016-11-22 14:23:25

标签: java junit mockito

@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
    }

2 个答案:

答案 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示例。