使用junit和mockito执行测试用例时,自动连接的依赖项不会被模拟

时间:2013-06-14 09:23:00

标签: java junit mockito

我在测试用例中使用Junit4和Mockito,在下面的代码dbprop.getProperty("config")中抛出NullPointerException,因为dbProp为null。请帮帮我解释为什么没有嘲笑?

public abstract class BaseClass {
    @Autowired
    protected DBproperties dbprop;
}

public class SampleClass extends BaseClass {
    @Autowired
    private OrderService orderService;

    valdiateOrder(String input) {
        String config = dbprop.getProperty("config");
    }
}

public class TestSampleClass {
    @InjectMocks
    SampleClass sampleClass;

    @Mock
    private OrderService orderService;

    @Test
    public void testValidateOrder() {
        DBproperties dbprop = mock(DBproperties .class);
        when(dbprop.getProperty("config")).thenReturn("xxxx");
        assertNotNull(SampleClass.valdiateOrder("xxx"));
    }
}  

2 个答案:

答案 0 :(得分:2)

您的dbprop模拟尚未注入sampleClass,您需要添加:

@Mock
private DBproperties dbprop;

然后从测试方法中删除dbprop模拟创建:

@Test
public void testValidateOrder() {
    // DBproperties dbprop = mock(DBproperties .class); <-- removed
    when(dbprop.getProperty("config")).thenReturn("xxxx");
    assertNotNull(SampleClass.valdiateOrder("xxx"));
}

接下来,为了确保在使用@InjectMocks注释时注入模拟,您需要添加以下运行符:

@RunWith(MockitoJUnitRunner.class)
public class TestSampleClass {
...

或者使用@Before方法调用以下内容:

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

有关这两种方法的更多信息,请参阅MockitoAnnotationsMockitoJUnitRunner JavaDocs。

答案 1 :(得分:0)

您可以使用@Mock注释您的对象,因此它看起来像这样

@Mock DBproperties dbProperties; @Before public void init(){MockitoAnnotations.initMocks(this); }