2017-07-08 23 views
1

私はこの本の第5章の例で作業中です。4.テストクラスを実行しているときに、@Validテストの1つが機能していないことがわかりました。検証は行われませんでした(返された状態コード302とビュー名は "/ spitter/null"です)。しかし、Tomcatで実行するとうまく動作します。SpringMVC Mavenを使って@Validアノテーションをテストする

有効なjarファイル(hibernate-validatorとその依存関係)はMavenで読み込まれます。

プロジェクト全体がgithubにあります。

アイデア?

テストコードスニペット:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes={RootConfig.class, WebConfig.class}) 
public class SpitterControllerTest { 
    @Test 
    public void shouldFailValidationWithNoData() throws Exception { 
     SpitterRepository mockRepository = mock(SpitterRepository.class);  
     SpitterController controller = new SpitterController(mockRepository); 
     MockMvc mockMvc = standaloneSetup(controller).build(); 

     mockMvc.perform(post("/spitter/register")) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("registerForm")) 
      .andExpect(model().errorCount(5)) 
      .andExpect(model().attributeHasFieldErrors(
       "spitter", "firstName", "lastName", "username", "password", "email")); 
    } 
} 

SpitterControllerスニペット:

@RequestMapping(value="/register", method=POST) 
    public String processRegistration(
     @Valid Spitter spitter, 
     Errors errors) { 
    if (errors.hasErrors()) { 
     return "registerForm"; 
    } 

    spitterRepository.save(spitter); 
    return "redirect:/spitter/" + spitter.getUsername(); 
    } 

Spitterスニペット:

@NotNull 
    @Size(min=5, max=16) 
    private String username; 

    @NotNull 
    @Size(min=5, max=25) 
    private String password; 

    @NotNull 
    @Size(min=2, max=30) 
    private String firstName; 

    @NotNull 
    @Size(min=2, max=30) 
    private String lastName; 

    @NotNull 
    @Email 
    private String email; 

どうもありがとう!

+0

standaloneSetupが必要ですか?代わりにwebAppContextSetupを考慮しましたか? –

+0

私はwebAppContextSetupを試しましたが、 '' org.springframework.dao.DataIntegrityViolationException'''を投げました。なぜなら、カラム名usernameにnullを挿入することはできないからです。それでも、 '' @ Valid''の検証は行われませんでした。それが検証されている場合は、例外がスローされてはいけません。 – fall

答えて

0

私はこれを試しましたpostさんの最善の答えです。私はhibernate-validatorのバージョンをpomの5.4.1.finalから5.2.4.finalに変更しました。 githubプロジェクトも更新されています。

0

マークあなたの@Validated

import org.springframework.validation.annotation.Validated; 

@Controller 
@Validated 
@RequestMapping("/spitter") 
public class SpitterController { 

@AutowiredSpitterControllerSpitterControllerと以下のように、注釈付きメソッドにメソッド・レベルの検証を実行するためのJSR-303プロバイダにMethodValidationPostProcessor豆いるデリゲートを作成します。

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = { RootConfig.class, WebConfig.class, 
     SpitterControllerTest.Config.class }) 
public class SpitterControllerTest { 

    @Autowired 
    private SpitterController spitterController; 

    @Configuration 
    public static class Config { 
     @Bean 
     public MethodValidationPostProcessor methodValidationPostProcessor() { 
      return new MethodValidationPostProcessor(); 
     } 
    } 

    @Test 
    public void shouldFailValidationWithNoData() throws Exception { 
    } 

} 
0

Iあなたのリポジトリをクローンし、あなたのjsp-api依存関係を2.2

0に更新することにより、譲渡を行うことができました
<dependency> 
    <groupId>javax.servlet.jsp</groupId> 
    <artifactId>jsp-api</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
</dependency> 

この依存関係の新しいバージョンがあります。 2.1バージョンを使用しているときに、バリデータがExtendedServletRequestDataBinderに登録/追加されていないか、より正確にはSpringValidatorAdapter targetValidatorがnullでした。 HV000183:

根本的な原因は、以下の例外がOptionalValidatorFactoryBean.afterPropertiesSet

javax.validation.ValidationExceptionにスローされたということでした を初期化できません 'javax.el.E​​xpressionFactory'。あなたはクラスパス上ELの依存関係に を持っている、またはその代わりに

ParameterMessageInterpolatorを使用していることを確認してください私はあなたがwebAppContextSetupを使用するが、まだ必要はありませんmock(SpitterRepository.class)への呼び出しを持っているあなたのshouldFailValidationWithNoDataテストを更新していることに気づきました。

+0

webAppContextSetupアドバイスをありがとう。私はjsp-apiをアップデートしようとしましたが、私のマシンでは動作しませんでしたが、別の解決策(https://stackoverflow.com/questions/24386771/javax-validation-validationexception-hv000183-unable-to-load-javax-el-express )あなたが説明した例外に私の問題を解決しました。私は、 'hibernate-validator'バージョンを' 5.4.1.final'から '5.2.4.final'に変更しました。 – fall

関連する問題