我想通过内容类型为JSON的MockMvc在控制器中发送一个模拟对象.但是当我尝试序列化模拟时,错误是:
java.lang.UnsupportedOperationException: Expecting parameterized type, got interface org.mockito.internal.MockitoInvocationHandler.
Are you missing the use of TypeToken idiom?
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
@Test
public void testSomething(){
String xyz = "";
Integer i = 10;
SomeClass inst = mock(SomeClass.class, withSettings().serializable());
when(inst.getProperty1()).then(xyz);
when(inst.getProperty2()).then(i);
Gson gson = new Gson();
String json = gson.toJson(inst); // this is creating error
this.mockmvc.perform(put("/someUrl/").contentType(MediaType.JSON).content(json)).andExpect(status().isOk());
}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我错过了什么吗?
我试图用TDD弄湿我的脚.我正在尝试使用Mockito与MockMvc和Junit一起为控制器编写单元测试用例.
但我收到运行时错误,从而导致我的测试失败.起初我在设置中初始化MockMvc实例时遇到问题,因为找不到它javax.servlet.SessionCookieConfig.
我通过下载javax.servletapi并将其配置到项目的构建路径中解决了这个问题,但后来我正面临着这个问题
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); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用mockMvc和mockito来测试我的控制器.实际控制器主体如下:
Message createXYZ(@RequestBody XYZ inst){
//creates XYZ
}
Run Code Online (Sandbox Code Playgroud)
现在通过请求体推送值,我通过序列化XYZ使用GsonBuilder创建一个JSON.这是XYZ类的结构:
class XYZ{
List<Y> listofYs;
//some other properties as well
}
Run Code Online (Sandbox Code Playgroud)
我正在为List listofYs创建和设置一个模拟器,当Gson尝试序列化一个XYZ实例时,它有一个模拟的listofYs它生成NPE.
有办法还是我完全错了?
我一直在使用Ivan Vaynberg的这个第三方插件,并且发现了一个问题.在select2中使用multiselect时,我发现select2("val")以排序顺序返回所选值,并且不反映元素选择的顺序,尽管select2("data")确实按顺序给出了选择.此外,它似乎是github中报告的错误,但奇怪的是第三方没有回应.https://github.com/ivaynberg/select2/issues/1861
是否有人面临类似的问题,并有解决方案?
无论如何在具有多个属性的选择选项上实现sortResults(基本上是多选),因为似乎sortResults仅适用于单个选择中提供的输入搜索栏.
谢谢.
我有一个初始化的对象:
Object obj = new Object(){
final String type = "java.lang.Integer";
final Object value = 6;
};
Run Code Online (Sandbox Code Playgroud)
我想重新创建这个对象:
Integer i = 6;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以获得对象的type字段obj并使用反射创建一个新实例并将其中的值提供给它?
编辑:在扩展这个问题后,我发现如果我将对象存储在文件中并使用Jackson使用以下文件从文件中检索它:
Reader reader = new Reader();
MyClass[] instances = reader.readValue(fileName);
Run Code Online (Sandbox Code Playgroud)
并MyClass定义为:
class MyClass{
List<Object> fields;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
现在我正在迭代fields并使用代码将它们转换为适当的对象:
public static Class<?> getTypeForObject(Object field) {
Field returnType = null;
try {
returnType = field.getClass().getDeclaredField("type");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch …Run Code Online (Sandbox Code Playgroud) 我有一个关于使用参数化测试来查询我的API单元测试的查询.而不是建立一个类似的arraylist
Arrays.asList(new Object[]{
{1},{2},{3}
});
Run Code Online (Sandbox Code Playgroud)
我想逐个读取文件中的行并将它们填入数组中.这样一切都会被推广.任何人都可以用示例建议我这样的方法吗?
还有一种方法可以在不将各种参数声明为私有成员并在测试单元的构造函数中初始化它的情况下进行测试吗?
编辑:Duncan提出的代码
@RunWith(Parameterized.class)
public class JunitTest2 {
SqlSession session;
Integer num;
Boolean expectedResult;
static BufferedInputStream buffer = null;
public JunitTest2(Integer num, Boolean expected){
this.num = num;
this.expectedResult = expected;
}
@Before
public void setup() throws IOException{
session = SessionUtil.getSqlSessionFactory(0).openSession();
SessionUtil.setSqlSession(session);
buffer = new BufferedInputStream(getClass().getResourceAsStream("input.txt"));
System.out.println("SETUP!");
}
@Test
public void test() {
assertEquals(expectedResult, num > 0);
System.out.println("TESTED!");
}
@Parameterized.Parameters
public static Collection getNum() throws IOException{
//I want my code to read input.txt line by line …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下定义的类User:
class User {
Integer id;
String name;
String addr;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
现在,在测试函数时,我需要返回一个存根的模拟用户列表,例如:
Mockito.when(userService.getListOfUsers()).thenReturn(mockList);
Run Code Online (Sandbox Code Playgroud)
现在可以按如下方式创建此mockList:
List mockList = Mockito.mock(ArrayList.class);
Run Code Online (Sandbox Code Playgroud)
但是这个mockList可以是任何东西的列表.我无法确保其类型.有没有办法创建列表:
List<User> mockListForUser = Mockito.mock(?);
Run Code Online (Sandbox Code Playgroud) 我最近在与JUnit和Mockito合作开发TDD.出于某种方法,我正在使用Util类(在项目上下文中具有方法的实用程序类).我面临的问题是如何在Mockito中模拟这些类.我无法在Mockito中找到关于静态方法的实现.有人建议在Mockito上使用PowerMock,但不会取代我的JunitMockitoRunner吗?
我使用静态函数的方式是:
public void doSomething(int x){
//Some code
Y y = Util.someStaticMethod(x);
//Some more code
}
Run Code Online (Sandbox Code Playgroud)
编辑:我也读到某处使用静态方法是代码气味,是一个糟糕的设计的标志.那么我应该如何重构设计以及我将获得哪些优势呢?
java ×7
mockito ×5
unit-testing ×4
junit ×3
gson ×2
javascript ×1
jquery ×1
json ×1
junitparams ×1
mocking ×1
mockmvc ×1
reflection ×1
select ×1