2017-05-24 97 views
0

我一直在学习更多关于Java中的Mockito框架,并且我迷失了如何完成这个单元测试。Mockito - Spring单元测试

基本上,控制台的错误指出,当Bar.sayHi()方法试图从Foo测试运行时,存在NullPointerException。我怀疑它与自动布线领域有关(但我可能错了)?

下面是问题的一个简单的例子,我遇到:

@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

    @Mock 
    //@Spy // Cannot spy on an interface 
    IBar bar; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() { 

     // Given 
     FooImpl foo = new FooImpl(); 
     foo.saySaySay(); 

     // When 

     // Then 

    } 

} 

这里是正在测试的FooImpl类(有Foo的接口):

public class FooImpl implements IFoo { 

    @Autowired 
    private IBar bar; 

    public void saySaySay() { 
     bar.sayHi(); 
    } 

} 

,酒吧(还有一个Bar的界面):

public class BarImpl implements IBar { 

    @Override 
    public void sayHi() { 
     System.out.println("hello"); 
    } 

} 

有没有人有建议这个?谢谢。

+1

https://dzone.com/articles/use-mockito-mock-autowired根据这一点,你可能需要'@ InjectMocks'上'FooImpl'例如允许自动的Mockito创建它(并注入依赖关系)而不是手动创建。你尝试过吗? –

+0

我现在就试试这个,但是我使用的是Mockito Cookbook(Marcin Grejszczak),书中提到你可以使用setUp方法或InjectMocks进行初始化 - 所以我认为它们是一样的。 – rj2700

回答

3

只是创建一个Ibar的模拟不会注入@Autowired字段的模拟。 自动装配是Spring的工作,而不是Mockito。 你需要明确地告诉使用的Mockito @InjectMock

@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 
    @InjectMocks 
    FooImpl foo; 

    @Mock 
    IBar bar; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 
    @Test 
    public void test() { 
     foo.saySaySay(); 
    } 

} 

或手动设置模拟对象的测试对象中注入那些为测试对象。

@Test 
public void test() { 
    FooImpl foo = new FooImpl(); 
    ReflectionTestUtils.setField(foo, "bar", bar); 
    foo.saySaySay();  
} 
0
RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

    @Mock 
    //@Spy // Cannot spy on an interface 
    IBar bar; 


    @InjectMocks 
    private FooImpl foo; 
    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() { 

     // Given 
     foo.saySaySay(); 
     verify(bar).sayHi(); 
     // When 

     // Then 

    } 

}