如何使用powermock模拟应用程序属性注释?

时间:2017-09-11 04:55:35

标签: spring-boot junit powermock powermockito

我在春季启动项目中遇到了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模拟应用程序比例吗?

全部谢谢!

1 个答案:

答案 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