Hum*_*ing 3 java spring unit-testing mockito
由于我是Spring Test MVC的新手,我不明白这个问题.我从http://markchensblog.blogspot.in/search/label/Spring中获取了以下代码
变量mockproductService不是从Application Context注入的,它null在使用@Mock注释和获取assetion错误时包含值.
我目前遇到的断言错误如下:
java.lang.AssertionError: Model attribute 'Products' expected:<[com.pointel.spring.test.Product@e1b42, com.pointel.spring.test.Product@e1f03]> but was:<[]>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
at org.springframework.test.web.servlet.result.ModelResultMatchers$2.match(ModelResultMatchers.java:68)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141)
at com.pointel.spring.test.ProductControllerTest.testMethod(ProductControllerTest.java:84)
Run Code Online (Sandbox Code Playgroud)
注意:如果我使用@Autowired而不是@Mock它工作正常.
测试控制器类
RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:mvc-dispatcher-servlet.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class})
public class ProductControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@InjectMocks
private ProductController productController;
@Mock
//@Autowired
private ProductService mockproductService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
List<Product> products = new ArrayList<Product>();
Product product1 = new Product();
product1.setId(new Long(1));
Product product2 = new Product();
product2.setId(new Long(2));
products.add(product1);
products.add(product2);
Mockito.when(mockproductService.findAllProducts()).thenReturn(products);
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testMethod() throws Exception {
List<Product> products = new ArrayList<Product>();
Product product1 = new Product();
product1.setId(new Long(1));
Product product2 = new Product();
product2.setId(new Long(2));
products.add(product1);
products.add(product2);
RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/products");
this.mockMvc.perform(requestBuilder).
andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.model().attribute("Products", products))
//.andExpect(MockMvcResultMatchers.model().size(2))
.andExpect(MockMvcResultMatchers.view().name("show_products"));
}
}
Run Code Online (Sandbox Code Playgroud)
控制器类
@Controller
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping("/products")
public String testController(ModelMap model){
model.addAttribute("Products",productService.findAllProducts());
return "show_products";
}
}
Run Code Online (Sandbox Code Playgroud)
WebServletContext mvc-dispatcher-servlet.xml
<bean id="someDependencyMock" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.pointel.spring.test.ProductService" />
</bean>
<context:component-scan base-package="com.pointel.spring.test" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
Run Code Online (Sandbox Code Playgroud)
对于我来说,目前还不清楚Spring和Mockito的组合如何从引用的博客源中获取它应该如预期的那样工作.至少我可以解释你的观察:
this.mockMvc.perform())正在处理Spring创建的Web应用程序上下文.在那个上下文ProductController中由Spring(context:component-scan)实例化.在productService随后与自动连接的Mockito嘲笑你创造mvc-dispatcher-servlet.xml的someDependencyMock.mockproductServicevia @Autowired,Spring会someDependencyMock从其上下文中注入实例.因此,您的Mockito.when()呼叫在此实例上正常工作,该实例已正确连接到ProductController前面提到的那个.mockproductServicevia @Mock,那么Mockito会注入一个新的实例ProductService,而不是Spring的一个实例,因为它根本不了解Spring.因此,您的Mockito.when()调用不会在Spring自动装配的模拟上运行,因此someDependencyMock保持未初始化状态.那么对于我来说,关于博客的原始代码是如何工作的,我还不清楚:
productController注释的属性@InjectMocks将由Mockito初始化,甚至正确连接到mockproductService测试类中.但Spring对该对象一无所知,也不会在this.mockMvc.perform()调用中使用它.因此,即使您删除了测试类中的属性和调用,我也会假设您mockproductService只@Autowired按预期注入测试工作.productControllerMockitoAnnotations.initMocks()| 归档时间: |
|
| 查看次数: |
17277 次 |
| 最近记录: |