有什么方法可以使用 junit 测试匿名内部 class 吗?
Is there any way to test an anonymous inner class using junit?
我想测试以下 class。必须测试匿名内部 class 被证明是非常困难的。任何帮助将不胜感激。
@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;
}
};
}
}
这应该是测试你内心所需要的最低限度 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 {
}
}
这个测试做了一些事情:
- 它利用 SpringRunner.class 为您的测试创建一个 ApplicationContext。
- @ContextConfiguration 注释获取静态嵌套的 class SpringTestConfig。 class 执行繁重的工作,实际上扫描基础包以寻找其他 class 标有配置、Bean、组件等的 es。这将发现您的配置,进而导致 Bean 的实例化。
- 由于现在已设置应用程序上下文,我们可以像在普通应用程序代码中一样使用@Autowired 注入 bean。
我需要以下 Maven 依赖项来完成此操作(需要 junit >= 4.12)。全部在maven central中可用:
<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>
我想测试以下 class。必须测试匿名内部 class 被证明是非常困难的。任何帮助将不胜感激。
@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;
}
};
}
}
这应该是测试你内心所需要的最低限度 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 {
}
}
这个测试做了一些事情:
- 它利用 SpringRunner.class 为您的测试创建一个 ApplicationContext。
- @ContextConfiguration 注释获取静态嵌套的 class SpringTestConfig。 class 执行繁重的工作,实际上扫描基础包以寻找其他 class 标有配置、Bean、组件等的 es。这将发现您的配置,进而导致 Bean 的实例化。
- 由于现在已设置应用程序上下文,我们可以像在普通应用程序代码中一样使用@Autowired 注入 bean。
我需要以下 Maven 依赖项来完成此操作(需要 junit >= 4.12)。全部在maven central中可用:
<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>