Mockito:结合@Autowired 和@Mock
Mockito: combine @Autowired and @Mock
我在 Spring Web 模型-视图-控制器 (MVC) 框架应用程序中使用 Mockito(Java 的开源测试框架,根据 MIT 许可证发布)进行了此 junit 测试
我有这个测试:
@RunWith(MockitoJUnitRunner.class)
public class DeviceCatalogueControllerTest {
@InjectMocks
private DeviceCatalogueController controller;
@InjectMocks
protected SessionHelper sessionHelper;
@Mock
private MessageSource messageSource;
@Mock
protected CataloqueService cataloqueService;
@Autowired
protected ApplicationDao applicationDao;
@Before
public void setUpTest() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void testInitFormGet() throws Exception {
System.out.println ("SessionHelper sessionHelper --> " + sessionHelper);
//controller.initFormGet(searchForm, localeParam, request, response, model, locale)
controller.initFormGet(null, DEFAULT_LOCALE, request, response, null, new Locale(DEFAULT_LOCALE));
}
但是当 运行 测试 applicationDao 为 null
您的测试 class 完全不知道 Spring
。要在单元测试中使用 Spring
,您必须使用正确的注释 @RunWith(SpringJUnit4ClassRunner.class)
而不是您现在使用的 @RunWith(MockitoJUnitRunner.class)
。
然后在 @Before
方法中,您可以通过调用 MockitoAnnotations.initMocks(this);
来初始化 Mockito
模拟
您的测试 class 可以重新编码为:
@ContextConfiguration(locations = {"classpath:/application-context.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class DeviceCatalogueControllerTest {
@InjectMocks
private DeviceCatalogueController controller;
@InjectMocks
protected SessionHelper sessionHelper;
@Mock
private MessageSource messageSource;
@Mock
protected CataloqueService cataloqueService;
@Autowired
protected ApplicationDao applicationDao;
@Before
public void setUpTest() {
MockitoAnnotations.initMocks(this);
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void testInitFormGet() throws Exception {
System.out.println("SessionHelper sessionHelper --> " + sessionHelper);
//controller.initFormGet(searchForm, localeParam, request, response, model, locale)
controller.initFormGet(null, DEFAULT_LOCALE, request, response, null, new Locale(DEFAULT_LOCALE));
}
}
注意:在 @ContextConfiguration(locations = {"classpath:/application-context.xml"})
中为您的 application-context.xml
使用正确的 xml 路径
我在 Spring Web 模型-视图-控制器 (MVC) 框架应用程序中使用 Mockito(Java 的开源测试框架,根据 MIT 许可证发布)进行了此 junit 测试
我有这个测试:
@RunWith(MockitoJUnitRunner.class)
public class DeviceCatalogueControllerTest {
@InjectMocks
private DeviceCatalogueController controller;
@InjectMocks
protected SessionHelper sessionHelper;
@Mock
private MessageSource messageSource;
@Mock
protected CataloqueService cataloqueService;
@Autowired
protected ApplicationDao applicationDao;
@Before
public void setUpTest() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void testInitFormGet() throws Exception {
System.out.println ("SessionHelper sessionHelper --> " + sessionHelper);
//controller.initFormGet(searchForm, localeParam, request, response, model, locale)
controller.initFormGet(null, DEFAULT_LOCALE, request, response, null, new Locale(DEFAULT_LOCALE));
}
但是当 运行 测试 applicationDao 为 null
您的测试 class 完全不知道 Spring
。要在单元测试中使用 Spring
,您必须使用正确的注释 @RunWith(SpringJUnit4ClassRunner.class)
而不是您现在使用的 @RunWith(MockitoJUnitRunner.class)
。
然后在 @Before
方法中,您可以通过调用 MockitoAnnotations.initMocks(this);
Mockito
模拟
您的测试 class 可以重新编码为:
@ContextConfiguration(locations = {"classpath:/application-context.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class DeviceCatalogueControllerTest {
@InjectMocks
private DeviceCatalogueController controller;
@InjectMocks
protected SessionHelper sessionHelper;
@Mock
private MessageSource messageSource;
@Mock
protected CataloqueService cataloqueService;
@Autowired
protected ApplicationDao applicationDao;
@Before
public void setUpTest() {
MockitoAnnotations.initMocks(this);
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void testInitFormGet() throws Exception {
System.out.println("SessionHelper sessionHelper --> " + sessionHelper);
//controller.initFormGet(searchForm, localeParam, request, response, model, locale)
controller.initFormGet(null, DEFAULT_LOCALE, request, response, null, new Locale(DEFAULT_LOCALE));
}
}
注意:在 @ContextConfiguration(locations = {"classpath:/application-context.xml"})
application-context.xml
使用正确的 xml 路径