我知道我需要接受的JSON对象始终是单键和值.我尝试使用@RequestBody Map和@RequestBody Map编写我的Spring MVC控制器,但是我总是得到400 Bad Request.当我将@RequestBody更改为String时,我看到我的数据通过,并且没有返回Bad Request响应.是否可以编写一些内容来接受任意JSON对象,该对象始终符合作为单个单个键的合同值?
@RequestMapping(value = "/advancedSearch", method = RequestMethod.POST,consumes ="application/json",produces = "application/json")
@ResponseBody
public MyResponse performAdvancedSearch(@RequestBody String advancedFormData) throws Exception{
Run Code Online (Sandbox Code Playgroud)
这是现在使用String的映射...
样品JSON-
{"name":"frank","Type":"Lumber"}
Run Code Online (Sandbox Code Playgroud)
当从前端发布时,我调用JSON.stringify()来创建data.Again,JSON总是很简单,没有嵌套列表/对象只是直接键/值.服务器端永远不会知道有多少个键值对进来,并且它不知道所有潜在的键,所以我不能创建一个简单的POJO.
我无法找到或者我在错误的地方查找有关片段如何匹配的任何文档.当我使用香草Apollo客户端如果我关闭addTypename我使用片段时的选项我得到一个警告heuristic fragment matching going on!,如果我添加它会消失,但我的回复包含许多__typename我不需要的字段.他们为什么帮忙?
我找到了一些答案,但没有什么对我有用.
试图模拟返回void的Apache Shiro Subject接口登录方法.
接口:
void login(AuthenticationToken token) throws AuthenticationException;
Run Code Online (Sandbox Code Playgroud)
我试过了 :
#1
val subject = mock[Subject]
doNothing().when(subject).login(new UsernamePasswordToken())
#2
val subject = mock[Subject]
doNothing().when(subject).login(any[UsernamePasswordToken])
#3
when(subject.login(any[UsernamePasswordToken])).thenAnswer(new Answer[Void]() {
override def answer(invocation: InvocationOnMock): Void = {
null:Void
}
Run Code Online (Sandbox Code Playgroud)
我在登录时不断收到NullPointerException.我的目标是测试登录方法并测试一些成功案例以及此方法抛出异常的一些失败案例.
我一直在将一些代码转换为异步.原始单元测试使用了注释,@Test(expected = MyExcpetion.class)但我认为这不会起作用,因为我要断言的异常包含在内java.util.concurrent.ExcutionException.我确实尝试过这样称呼我的未来,但我的断言仍然失败,我不喜欢我必须加入return null
myApiCall.get(123).exceptionally((ex) -> {
assertEquals(ex.getCause(),MyCustomException.class)
return null
}
Run Code Online (Sandbox Code Playgroud)
我也试过这种味道,但仍然无法正常工作
myApiCall.get(123).exceptionally((ex) -> {
assertThat(ex.getCause())
.isInstanceOF(MyException.class)
.hasMessage("expected message etc")
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果我的API无法找到id,则会抛出异常.我应该如何正确测试?无论如何我可以使用原始注释吗?
我的api调用在运行时伸出到db.在这个测试中,我正在设置我的未来以返回错误,因此它实际上并没有尝试与任何东西进行通信.被测代码看起来像这样
public class myApiCall {
public completableFuture get(final String id){
return myService.getFromDB(id)
.thenApply(
//code here looks at result and if happy path then returns it after
//doing some transformation
//otherwise it throws exception
)
}
}
Run Code Online (Sandbox Code Playgroud)
在单元测试中我强制myService.getFromDB(id)返回坏数据,这样我就可以测试异常并保持这个单元测试不会到达db等.
我升级到完全异步,我有一个exsiting测试,单元测试控制器与模拟依赖项并测试各种路径.我无法弄清楚如何转换此单元测试.我正在使用dropwizard/jersey,我想测试的方法现在看起来像这样
@POST
public void getPostExample(final Map body, @Suspended final AsyncResponse
asyncResponse){}
Run Code Online (Sandbox Code Playgroud)
旧测试使用mockito/junit并@InjectMocks用于控制器,然后调用该方法getPostExample并在响应上声明一些信息.它调用的服务是模拟的,但是当我搜索如何手动获取它以返回数据时,我找不到太多.我可以访问AsyncResponse但是在实际代码中调用带有结果的简历.我应该在测试中调用简历吗?
我有一个端点,我们可以调用/test内部从第三方API获取数据,然后想要在返回响应之前进行一些转换.我挂断的地方是这个第三方API正在返回gzip压缩的JSON,我还无法解码它(还).我找到了decodeRequest指令,但似乎我必须在我的路由中使用它,我在这里更深层次.我有一个内部方法,一旦我收到一个GET到我的端点/test,这个方法被命名为do3rdPartyAPIRequest 我建立一个HttpRequest并传递给 Http().singleRequest()我,然后作为回报,我有一个Future[HttpResponse]我认为我想成为的地方,但我被困在这里.
使用我以类似的方式构建和使用的一些本地API,我没有对我的响应进行编码,因此我通常会Future[HttpResponse]检查响应状态并转换为JSON,Unmarshal但是在转换为之前,这需要一个额外的步骤. JSON.我意识到这个问题与这个问题非常相似,但这是喷涂特定的,我无法将此答案翻译成当前的akka http
java ×3
json ×2
junit ×2
scala ×2
spring ×2
spring-mvc ×2
akka-http ×1
apollo ×1
dropwizard ×1
graphql ×1
java-8 ×1
jersey ×1
junit4 ×1
mockito ×1
spec2 ×1
spring-boot ×1
unit-testing ×1