java - @SpringBootTest 测试类是否正确?

标签 java spring unit-testing spring-boot junit

这就是单元测试的正确本质吗?我想我不明白我应该测试什么。 ConverterContext是一个策略类

@SpringBootTest
@ExtendWith(SpringExtension.class)
class ConverterContextTest {

    @Autowired
    private final ConverterContext converterContext;
    @Autowired
    private final ConverterRegisterUserDto created;

    @Autowired
    ConverterContextTest(ConverterContext converterContext, ConverterRegisterUserDto created) {
        this.converterContext = converterContext;
        this.created = created;
    }

    @Test
    void converterContextGivesCorrectConverter(){
        ConverterRegisterUserDto returned = converterContext.getConverter(ConverterRegisterUserDto.class);
        assertEquals(returned, created);
    }

    @Test
    void converterContextGivesIncorrectConverter(){
        ConverterShowUserDto returned = converterContext.getConverter(ConverterShowUserDto.class);
        assertNotEquals(returned, created);
    }
}

最佳答案

在单元测试中,您希望避免加载 spring boot 上下文。所以自己实例化ConverterContext
如果 ConverterContext 有一些您需要隔离的依赖项,您可以模拟它们(请参阅 Mockito 库)。
此外,您不需要 Autowiring 预期的内容。
它将使您的测试执行起来更快,更易于阅读。
请注意,在您的代码中 ConverterContext 显示为工厂而不是策略。

关于你的测试逻辑,我认为不需要第二个测试。
你要检查的是工厂返回它设计返回的东西。
断言实际不等于愚蠢的预期是完全没有用的。它就像死代码,你必须维护...
实际上,就像您在第一个测试中断言 add(1,1) == 2 而在第二个测试中断言 add (2,1) != 2.
为什么不断言所有 dumb expected 都不相等? add(2,1) != 4, add(2,1) != 5, >add(2,1) != 6,我们可以继续很长时间....

我希望单元测试看起来像(我使用 JUnit 5 方式来说明):

import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.Mock;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MockitoExtension.class)
class ConverterContextTest {

    ConverterContext converterContext;  

    @Mock
    FooDep fooDep;

    @Mock
    BarDep barDep;

    @BeforeEach // or @Before in JUnit 4
    void init{
        converterContext = new ConverterContext(fooDep, barDep);
    }

    @Test
    void converterContextGivesCorrectConverter(){
        // mock which is required
        /...
        assertEquals(new ConverterRegisterUserDto(), converterContext.getConverter(ConverterRegisterUserDto.class));
        // mock which is required
        /...
        assertEquals(new ConverterShowUserDto(), converterContext.getConverter(ConverterShowUserDto.class));
    }
}

关于java - @SpringBootTest 测试类是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51774996/

相关文章:

java - 绩效改进 - 如何开始

spring - java.lang.AbstractMethodError : oracle. jdbc.driver.T4CPreparedStatement.setCharacterStream(ILjava/io/Reader;J)V

java - 如何使用spring security检查用户是否从另一个webapp登录

c# - 有效地使用单元测试/有人尝试过汇编方法吗?

javascript - 使用 jsdom、sinon、mocha 和 chai 测试图像加载

java - JFrame 将登录表单锁定在主表单前面

java - 在 Java 中向上转换子类引用

Java Odd pack() 行为

java - 异步运行方法返回值到回调URL

java - 在 Spring Boot 中使用 mock 对接口(interface)实现进行单元测试