2017-10-12 54 views
0

私はテストしたい次のクラスを持っています。匿名の内部クラスをテストすることは非常に困難であることが証明されています。どんな助けもありがとう。junitを使って匿名の内部クラスをテストする方法はありますか?

@Configuration 
public class CustomErrorConfiguration { 

    @Bean 
    public ErrorAttributes errorAttributes() { 
     return new DefaultErrorAttributes() { 

      @Override 
      public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, 
        boolean includeStackTrace) { 
       Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); 
       errorAttributes.remove("timestamp"); 
       errorAttributes.remove("status"); 
       errorAttributes.remove("exception"); 
       errorAttributes.remove("path"); 
       if (errorAttributes.containsKey("error") && errorAttributes.containsKey("message")) { 
        Map<String, Object> attr = new HashMap<>(); 
        attr.put("message", errorAttributes.get("message")); 
        return attr; 
       } 
       return errorAttributes; 
      } 

     }; 
    } 

} 
+4

なぜCustomErrorConfiguration内に静的クラスを作成してテストできないのですか? – mlecz

答えて

1

これは、最小値は、あなたの内部クラスをテストするために必要なする必要があります。

  1. は、それはあなたのためのApplicationContextを作成するためにSpringRunner.classを活用:このテストでは、いくつかのことを行います

    import org.junit.Test; 
    import org.junit.runner.RunWith; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.context.annotation.ComponentScan; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.test.context.ContextConfiguration; 
    import org.springframework.test.context.junit4.SpringRunner; 
    
    @RunWith(SpringRunner.class) 
    @ContextConfiguration 
    public class BeanTest { 
    
        @Autowired 
        ErrorAttributes errorAttributes; 
    
        @Test 
        public void testMyBean() { 
         RequestAttributes requestAttributes = new RequestAttributes(); 
         System.out.println(errorAttributes.getErrorAttributes(requestAttributes, true)); 
        } 
    
        @Configuration 
        @ComponentScan(basePackages = "package.where.your.configuration.is") 
        public static class SpringTestConfig { 
    
        } 
    } 
    

    テスト。

  2. @ContextConfigurationアノテーションは、静的ネストされたクラスSpringTestConfigを取得します。このクラスは、重い持ち上げを行い、実際にConfiguration、Bean、Componentなどでマークされた他のクラスを探している基本パッケージをスキャンします。これはあなたのBeanのインスタンス化を引き起こすConfigurationを発見します。
  3. アプリケーションコンテキストが設定されているので、通常のアプリケーションコードと同じように、@AutowiredでBeanを注入できます。

これを達成するには、次のような依存関係が必要でした(junit> = 4.12必須)。

<dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>5.0.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>5.0.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>5.0.0.RELEASE</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
関連する問題