我在春季启动项目中遇到了powermock的问题。
我的application.yml看起来像这样:
app:
cache:
config:
connection-time-out: 1000
time-expired: 10000
name: "cacheName"
这是我的applicationProps.java:
@ConfigurationProperties(prefix = "app", ignoreUnknownFields = false)
public class ApplicationProps {
private final Cache cache = new Cache();
public Cache getCache() {
return cache;
}
public static class Cache() {
private String name = "";
private final Config config = new Config();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Config getConfig(){
return config;
}
public static class Config() {
int connectionTimeOut;
int timeExpired;
public int getTimeExpried() {
return timeExpried;
}
public void setTimeExpried(int timeExpried) {
this.timeExpried = timeExpried;
}
public int getConnectionTimeOut() {
return connectionTimeOut;
}
public void setConnectionTimeOut(int connectionTimeOut) {
this.connectionTimeOut = connectionTimeOut;
}
}
}
}
CacheConfig.java:
@Configuration
public class CacheConfig() {
@Autowired
private ApplicationProps applicationProps;
public void init() {
String name = applicationProps.getCache().getName();
int timeExpired = applicationProps.getCache().getConfig().getTimeExpried();
}
}
和CacheConfigTest.java
@RunWith(PowerMockRunner.class)
public class SQSConfigTest {
@Mock
ApplicationProps applicationProps;
@InjectMocks
CacheConfig cacheConfig;
@Test
public void initTest() {
cacheConfig.init();
}
}
当我运行jnuit时,测试会抛出nullException,它不能在applicationProps中模拟属性,而且它总是为null。
任何人都有这个错误的解决方案。可以用powermock模拟应用程序比例吗?
全部谢谢!
答案 0 :(得分:0)
正如评论中所提到的,您获得NullPointerException
的原因是因为您使用的模拟框架会嘲弄ApplicationProps
。这意味着它本身不会有任何行为,但这也意味着所有方法现在都返回null
。
使用CacheConfig
init()
方法:
applicationProps.getCache().getConfig().getTimeExpried();
由于applicationProps.getCache()
被模拟,它将返回null
。但是,由于您在此之后调用了getConfig()
,因此会抛出您{1}}。
解决方案是正确模拟这些调用。如果您想确保NullPointerException
设置正确,则需要在调用timeExpired
时返回一些内容。你这样做的方式取决于模拟框架(Powermock可以与Mockito,Easymock集成......)。
使用applicationProps.getCache()
时,您可以执行以下操作:
PowerMockito
在此测试中,您可能希望返回一个新的when(applicationProps.getCache()).thenReturn(...);
对象,其中包含Cache
个对象,且值为Config
。