7

私のエンティティには、@NotEmpty、@Pattern など、検証用の休止状態の注釈がいくつかあります。

私のコントローラーでは、保存アクションに @Valid パラメーターがあります。

しかし、エンティティに必須フィールドがあり、注釈がない場合、問題が発生します。

そのため、各エンティティをテストして、必要なメモがあることを確認したいと思います。

何かのようなもの:

@Test(expect=IllegalArgumentException.class)
public void testAllNull() {
    Person p = new Persson(); // Person name has an @NotEmpty
    validator.validate(p);
}

しかし、それを検証する方法は?@Valid を確認するために呼び出されるのは誰ですか?

ありがとう。

4

3 に答える 3

7

私はチェックする方法を見つけました:

    @Autowired
    private LocalValidatorFactoryBean validator;

    ...

    validator.validateProperty(object, propertyName)
于 2012-12-06T17:11:20.387 に答える
3

これは、 @Validアノテーションの存在と処理を検証し、エラーが発生した場合にカスタム JSON 応答を構築するテストの Spring v4.1.x ベースの例です。

jUnit

import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import javax.inject.Inject;
import java.util.List;

import static org.abtechbit.miscboard.util.JsonUtils.toJson;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        RegistrationValidationTest.MockDependencies.class,
})
public class RegistrationValidationTest {

    @Inject
    MockMvc mvc;

    @Test
    public void validatesRegistration() throws Exception {
        Registration registration = ... //build an invalid Registration object
        MvcResult result = mvc.perform(post(RegistrationController.CONTEXT_REGISTER).
                contentType(MediaType.APPLICATION_JSON).
                content(toJson(registration))).
                andExpect(status().isBadRequest()).
                andExpect(content().contentType(MediaType.APPLICATION_JSON)).
                andReturn();

        assertThat(result.getResolvedException(), is(notNullValue()));
        String content = result.getResponse().getContentAsString();
        assertThat(content, is(notNullValue()));
        List<Message> messages = JsonUtils.fromJson(content, new TypeReference<List<Message>>() {
        });
        assertThat(messages.size(), is(1));
    }

    public static class MockDependencies {

        @Bean
        public MockMvc mvc() {
            return MockMvcBuilders.standaloneSetup(new RegistrationController()).build();
        }
    }
}

コントローラ

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

@Controller
public class RegistrationController
{
    public static final String CONTEXT_REGISTER = "/register";

    @RequestMapping(value = CONTEXT_REGISTER, method = RequestMethod.POST)
    @ResponseBody
    public String register(@RequestBody @Valid Registration registration) {
        //perform registration
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<List> handleValidationException(MethodArgumentNotValidException ex) {
        //Build a list of custom Message{String message;} objects
        List<Message> messages = ex.getBindingResult().getAllErrors().
                stream().map(e->new Message(e.getDefaultMessage())).collect(Collectors.toList());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON).body(messages);
    }
}
于 2015-08-03T00:32:26.643 に答える
0

Spring MVC Test Frameworkは良い選択かもしれません。これを使用することで、Spring @MVC が実際に機能するように、テストの検証でコードが実行されることを保証できます。

実際、アノテーションは、Spring コントローラーのハンドラー メソッドでアノテーションを処理する@Validによって検出されます。HandlerMethodInvoker内部的にはValidator、アプリケーションのコンテキスト設定に応じて、実際の検証ロジックが Bean に委任されます。(Hibernate Validator は広く使用されています。)

@Falciが指摘したように、デフォルトの構成(例<mvc:annotation-driven />)では、注釈LocalValidatorFactoryBeanを処理するために内部的に使用されます@Validが、時々異なる場合があります。代わりに、Spring MVC テスト フレームワークは、メイン アプリケーションが使用するのと同じ環境を提供するため、適切な選択です。

于 2013-02-15T08:47:11.257 に答える