由于我是Spring Test MVC的新手,所以我不了解此问题。我从http://markchensblog.blogspot.in/search/label/Spring中获取了以下代码
变量mockproductService
不是从Application Context
中注入的,它null在使用@Mock注释和获取资产错误时包含值。
我当前遇到的断言错误如下:
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)
注意:如果我使用@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"));
}
}
控制器类
@Controller
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping("/products")
public String testController(ModelMap model){
model.addAttribute("Products",productService.findAllProducts());
return "show_products";
}
}
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>
对我而言,您从引用的博客源中获取的Spring和Mockito的组合如何才能完全按预期工作,目前尚不清楚。至少我可以解释你的观察:
您的测试(this.mockMvc.perform())
正在使用Spring创建的Web应用程序上下文。在这种情况下ProductController,由Spring(context:component-scan)
实例化。在productService随后与您创建的模拟的Mockito自动连接mvc-dispatcher-servlet.xml的someDependencyMock
。
如果注入mockproductServicevia @Autowired,SpringsomeDependencyMock
将从其上下文注入实例。因此,您的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()
问题内容: 我正在使用一个已定义的拦截器,我想从拦截器中通过DAO层进行db调用,所以我如何将Spring bean注入到struts拦截器中。是否可以将spring bean注入到struts拦截器中,任何人都可以提出任何想法在此。 问题答案: 编辑 由于不需要将拦截器声明为Spring bean,因此删除了不必要的部分。感谢@AleksandrM对其进行测试。 就像使用Actions一样,(如
我正在编写单元测试,有一个非常复杂的设置。 依赖bean设置一些侦听器,并将它们传递给自动连线服务。 我想测试侦听器是否存在,但不调用它们,因此我想传递'null'而不是自动连线服务。(特别是:我没有二传手…) 请注意,SUT确实间接依赖于返回侦听器的类。 因为这是一个来自大设置的非常小的示例,所以我不想在这里使用mock,因为我只想测试侦听器的存在性而不是行为。 嘲笑20或30个这样的服务会大大
我有下面的映射器类,我想在其中使用。我正在尝试构造函数注入,但不起作用,并且正在打印。 mapStruct实现类 如果我使用使用字段注入,这样它就可以正常工作。这意味着Spring不支持类的构造函数注入。是因为类不能直接实例化,需要子类来实例化吗? 有没有什么方法可以在实现类中创建一个构造函数,如下所示: 这样,构造函数注入应该可以工作。
我正在为一个具有2级依赖注入的类编写一个测试用例。我对1级依赖项注入对象使用@Spy注释,我想模拟第2级注入。但是,我在第二级上不断遇到空指针异常。有没有办法将模拟注入@Spy对象?
我使用的是SpringMVC3.2。4和Apache Commons Pooling 2.3,用于管理到SOAP服务的连接。我正在使用的一个功能是GenericObjectPool类中的“空闲对象逐出”线程功能: http://commons.apache.org/proper/commons-pool/api-2.3/org/apache/commons/pool2/impl/GenericOb
我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!