日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator

發(fā)布時(shí)間:2025/3/15 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在將單元測(cè)試postmortem編碼到另一個(gè)項(xiàng)目創(chuàng)建的代碼時(shí),我遇到了如何使用initBinder模擬與控制器綁定的驗(yàn)證器的這個(gè)問題?

通常我會(huì)考慮確保我的輸入是有效的,并且在驗(yàn)證器中進(jìn)行一些額外的調(diào)用,但在這種情況下,驗(yàn)證器類與通過幾個(gè)數(shù)據(jù)源進(jìn)行檢查相結(jié)合,并且測(cè)試變得相當(dāng)麻煩.耦合可追溯到使用的一些舊的常用庫(kù),并且不在我目前的工作范圍內(nèi)來修復(fù)它們.

起初,我試圖使用PowerMock和嘲笑靜態(tài)方法來嘲笑驗(yàn)證器的外部依賴關(guān)系,但是最終遇到一個(gè)類,當(dāng)類被創(chuàng)建時(shí)需要一個(gè)數(shù)據(jù)源,沒有找到一個(gè)方法.

然后,我試圖使用普通的mockito工具來嘲笑驗(yàn)證器,但是也沒有.然后嘗試將驗(yàn)證器設(shè)置在mockMvc調(diào)用中,但不會(huì)為驗(yàn)證器注冊(cè)@Mock注釋.最后跑到this question.但是由于控制器本身沒有現(xiàn)場(chǎng)驗(yàn)證器,所以也失敗了.那么,我該如何解決這個(gè)問題呢?

驗(yàn)證器:

public class TerminationValidator implements Validator {

// JSR-303 Bean Validator utility which converts ConstraintViolations to Spring's BindingResult

private CustomValidatorBean validator = new CustomValidatorBean();

private Class extends Default> level;

public TerminationValidator(Class extends Default> level) {

this.level = level;

validator.afterPropertiesSet();

}

public boolean supports(Class> clazz) {

return Termination.class.equals(clazz);

}

@Override

public void validate(Object model,Errors errors) {

BindingResult result = (BindingResult) errors;

// Check domain object against JSR-303 validation constraints

validator.validate(result.getTarget(),result,this.level);

[...]

}

[...]

}

控制器:

public class TerminationController extends AbstractController {

@InitBinder("termination")

public void initBinder(WebDataBinder binder,HttpServletRequest request) {

binder.setValidator(new TerminationValidator(Default.class));

binder.setAllowedFields(new String[] { "termId[**]","terminationDate","accountSelection","iban","bic" });

}

[...]

}

測(cè)試類:

@RunWith(MockitoJUnitRunner.class)

public class StandaloneTerminationTests extends BaseControllerTest {

@Mock

private TerminationValidator terminationValidator = new TerminationValidator(Default.class);

@InjectMocks

private TerminationController controller;

private MockMvc mockMvc;

@Override

@Before

public void setUp() throws Exception {

initMocks(this);

mockMvc = standaloneSetup(controller)

.setCustomArgumentResolvers(new TestHandlerMethodArgumentResolver())

.setValidator(terminationValidator)

.build();

ReflectionTestUtils.setField(controller,"validator",terminationValidator);

when(terminationValidator.supports(any(Class.class))).thenReturn(true);

doNothing().when(terminationValidator).validate(any(),any(Errors.class));

}

[...]

}

例外:

java.lang.IllegalArgumentException: Could not find field [validator] of type [null] on target [my.application.web.controller.TerminationController@560508be]

at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:111)

at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:84)

at my.application.web.controller.termination.StandaloneTerminationTests.setUp(StandaloneTerminationTests.java:70)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)

at org.junit.runners.ParentRunner.run(ParentRunner.java:309)

at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)

at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

總結(jié)

以上是生活随笔為你收集整理的java控制单元测试_java – 当单元测试控制器时,模拟一个Spring Validator的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。