首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito测试@ConfigurationProperties

使用Mockito测试@ConfigurationProperties
EN

Stack Overflow用户
提问于 2019-08-01 15:46:26
回答 2查看 4.2K关注 0票数 2

我有configuration类:

代码语言:javascript
复制
@ConfigurationProperties(prefix = "myConfig")
public class MyConfig {
    protected String config;
}

我的服务使用这个配置类(它从application.yml获取值):

代码语言:javascript
复制
@Service
public class myService {

    @Inject
    private MyConfig myConfig;

    Public String getInfo (String param) {
        if (isEmpty(param)) { throw new InvalidParameterException; }
        return myConfig.getConfig();
    }
}

我正在尝试用Mockito来测试它:

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class myTest {

    @InjectMocks
    private MyService myService;

    @Mock
    private MyConfig myConfig;

    @Test
    public void myTest1() {
        myService.getInfo("a");
    }

    @Test
    public void myTest2() {
        assertThrows(InvalidParameterException.class, ()->myService.getInfo(null));
    }
}

myTest失败,因为config类被模拟,因此具有空值。用Mockito测试配置类的正确方法是什么?

编辑:我有许多像上面这样的配置类,它们正在myService中使用。

EN

回答 2

Stack Overflow用户

发布于 2019-08-01 16:10:40

你需要创建getter,然后它可以被Mockito模仿。

代码语言:javascript
复制
@ConfigurationProperties(prefix = "myConfig")
public class MyConfig {
    protected String config;

    public String getConfig() {
        return config;
    }
}

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class myTest {

    @InjectMocks
    private MyService myService;

    @Mock
    private MyConfig myConfig;

    @Before
    private void initializeConfig() {
        when(myConfig.getConfig()).thenReturn("someValue");
    }

    @Test
    public void myTest1() {
        myService.getInfo("a");
    }
}

但是如果你不想在test中显式地设置这个值,你应该创建一个Spring集成测试,它将创建整个上下文并使用真实的对象。但这超出了这个问题的范围。

票数 2
EN

Stack Overflow用户

发布于 2019-08-01 17:53:27

您应该用@Configuration标记MyConfig,以便Spring在应用程序上下文中创建一个Spring bean。

您还需要使用@RunWith(SpringRunner.class)

SpringRunner支持加载一个SpringRunner,并将ApplicationContext @a连接到您的测试实例中。

另外,还可以用@Autowired更改@Inject,因为我不确定spring将如何支持@inject

服务类

代码语言:javascript
复制
@Service
public class myService {

    @Autowired
    private MyConfig myConfig;

    Public String getInfo {
        return myConfig.getConfig();
    }
}

测试类

代码语言:javascript
复制
@RunWith(SpringRunner.class)
public class myTest {

    @Mock
    private MyService myService;

    @InjectMocks
    private MyConfig myConfig;

这是你应该在测试中获得真实对象的方法

编辑

考虑到您不想模仿myservice,那么我们应该用下面的代码替换您的测试类,并让我知道

代码语言:javascript
复制
@RunWith(SpringRunner.class)
public class myTest {

@autowired
private MyService myService;

@Test
public void myTest1() {
    myService.getInfo("<NAME_OF_PROPERTIES>");
}

@Test
public void myTest2() {
    assertThrows(InvalidParameterException.class, ()->myService.getInfo(null));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57304149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档