gpt4 book ai didi

spring - 在 Spring 上模拟 @Validated 带注释的 Controller 方法的 ConstraintValidator

转载 作者:行者123 更新时间:2023-12-03 23:22:08 24 4
gpt4 key购买 nike

使用 Spring Boot 1.3.6.RELEASE,我正在尝试使用 Junit、Mockito 和 MockMvc 对 Controller 方法进行单元测试。我构建了一个自定义约束验证器(扩展 ConstraintValidator ),它可以 Autowiring 服务。我的目标实体使用自定义验证器注释和一个组进行注释。我的 Controller 方法签名如下:

@RequestMapping ( value = "api/task/newtask", method = RequestMethod.POST )
public ResponseEntity submitTask ( @Validated ( value = TaskDependenciesDbValidation.class )
@RequestBody Task task )
我的自定义验证器的 isValid(..) 方法
@Override
public boolean isValid ( Ticket ticket, ConstraintValidatorContext context )
{
try
{
this.ticketService.verifyTicketExists( ticket.getId() );
return true;
} catch ( ResourceNotFoundException e )
{
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate( "Ticket with id " + ticket.getId() + " not found" )
.addConstraintViolation();
return false;
}
}

在运行时,一切正常。

我想通过完全模拟我的自定义约束验证器或只是模拟 来对我的 Controller 的 submitTask 方法进行单元测试。票务服务验证器使用的。

我曾尝试使用 Mockito.when(..) “传统地”(不是同时)模拟服务和验证器,但我在服务上收到 NullPointerException。

编辑 :

测试尝试:
@RunWith ( SpringJUnit4ClassRunner.class )
@SpringApplicationConfiguration ( classes = MyApplication.class )
@ContextConfiguration ( classes = MockServletContext.class )
@WebAppConfiguration
public class TaskControllerTests
{
@InjectMocks
TaskController taskController;
@Mock
TaskService taskService;
@Mock
TicketService ticketService;
.
.
@Before
public void setup ()
{
MockitoAnnotations.initMocks( this );
mockMvc = standaloneSetup( this.taskController )
.setControllerAdvice( new RestExceptionHandler() )
.build();
}
.
.
@Test
public void submitTask () throws Exception
{
when( taskService.create( any( Task.class ) ) ).thenReturn( this.task );
doNothing().when( ticketService ).verifyTicketExists( 1L );
mockMvc.perform( post( "/api/task/newtask" ).content( "..validpayload..") ).andExpect( status().isCreated() );
}
}

最佳答案

您可以使用 JMockit's @Mocked annotation 完全模拟验证器:

public class Test {

@Mocked // mocks the class everywhere
TaskDependenciesDbConstraintValidator validator;

@Test
public void testMethod(){
new Expectations {{ // expect the validator to be called
validator.isValid((Ticket) any, (ConstraintValidatorContext) any);
result = true; // and declare the object to be valid
}}

// do your testing here
}
}

至于你的例子,如果你对 Controller 进行单元测试,为什么要调出整个 Spring 上下文?因为那是你正在做的
@RunWith ( SpringJUnit4ClassRunner.class )
@SpringApplicationConfiguration ( classes = MyApplication.class )
@ContextConfiguration ( classes = MockServletContext.class )
@WebAppConfiguration

首先,您应该删除它们并重试。

关于spring - 在 Spring 上模拟 @Validated 带注释的 Controller 方法的 ConstraintValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38520389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com