Sou*_*abh 9 java junit mocking mockito mockmvc
我试图用TDD弄湿我的脚.我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写单元测试用例.
但我收到运行时错误,从而导致我的测试失败.起初我在设置中初始化MockMvc实例时遇到问题,因为找不到它javax.servlet.SessionCookieConfig
.
我通过下载javax.servlet
api并将其配置到项目的构建路径中解决了这个问题,但后来我正面临着这个问题
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()
Run Code Online (Sandbox Code Playgroud)
在perform()
MockMvc实例上使用时.
任何人都可以告诉我如何处理这种依赖,因为我认为它是由于不兼容的服务器servlet-api和javax.servlet api而发生的.
编辑:我发布我用于单元测试的代码,但我不认为这将是任何帮助,但以防万一:
@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest {
@InjectMocks
private MyController myController = new MyController();
@Mock
private MyService myService = new MyServiceImpl();
private MockMvc mockMvc;
@Before
public void setUp(){
this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
}
@Test
public void testList() throws Exception{
A a = new A();
a = createMockClassA();
Mockito.when(myService.getServiceForA(Mockito.anyMapOf(String.class, String.class))).thenReturn(a);
MvcResult result = this.mockMvc.perform(get("/somePath/")).param("someExpectedParam","value").andReturn();
System.out.println(result.getResponse().getContentAsString());
}
private static A createMockClassA(){
A a = new A();
a.setId(i);
a.setTitle("mock-" + i);
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
这听起来很像你在类路径中有错误版本的servlet API.
检查何时isAsyncStarted
添加到API并确保您在类路径中引用的那个至少是该版本或更高版本.
为了找到"错误"类版本的来源,你可以使用
-verbose:class
Run Code Online (Sandbox Code Playgroud)
java的参数.它将列出所有加载的类,如果我没记错的话,它们会被加载.有关详细信息,请参见http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html.