作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在初始化时读取文件的 Bean。该文件是特定于环境的,是在系统安装期间生成的。文件的路径被硬编码为代码中的最终静态变量。
private static final String FILE_PATH = "/etc/project/file.path";
private String decryptedPassword = "";
@Autowired
public ClassToBeTested(@Value("${pass}") String encryptedPassword)
{
String decryptedPassword = StaticClass.decrypt(encryptedPassword, FILE_PATH);
}
我需要以某种方式在 JUnit 测试中模拟此文件,以便我可以测试其余功能。 @Before 注释没有用,因为根据我的测试,即使它在 Bean 初始化之后运行。
可以使用的一种非常肮脏的方法是向 Autowired 函数添加另一个参数,该参数可以指示调用是否用于单元测试。但这确实不是一种干净的方法。例如:
private static final String FILE_PATH = "/etc/project/file.path";
private String decryptedPassword = "";
@Autowired
public ClassToBeTested(@Value("${pass}") String encryptedPassword,
@Value("${isTest}") boolean isTest)
{
if (isTest)
decryptedPassword = encryptedPassword;
else
decryptedPassword = StaticClass.decrypt(encryptedPassword, FILE_PATH);
}
有什么想法可以模拟 FILE_PATH 中的文件,这样我就不必使用此解决方法或在不更改 Bean 构造函数的情况下强制使用 Autowired 函数中的属性吗?
最佳答案
您可以使用 Whitebox 之类的工具来交换测试上下文中的 FILE_PATH。
public class MyClass {
private static String MY_STRING = "hello";
public void whatsMyString() {
System.out.println(MY_STRING);
}
}
Note that MY_STRING is not final
@Test
public void testWhiteboxSwap() {
MyClass test = new MyClass();
test.whatsMyString();
String testContextString = "\tgoodbye";
Whitebox.setInternalState(MyClass.class, testContextString);
test.whatsMyString();
}
控制台输出:
hello
goodbye
您可能仍然需要在测试结构中使用 @Before 或 @BeforeClass 来获得正确的时间,但是 Whitebox 可以促进您正在寻找的行为。
请注意,这不是线程安全的解决方案。如果多个测试更改静态引用,最后一个将获胜!
我为示例使用了一个 Maven 项目。我在下面附上了 pom 添加。
<dependency>
<groupId>org.powermock.tests</groupId>
<artifactId>powermock-tests-utils</artifactId>
<version>1.5.4</version>
</dependency>
关于java - 如何在 JUnit 测试初始化时模拟 Bean 所需的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38573456/
我是一名优秀的程序员,十分优秀!