这是单元测试的正确本质吗?我想我不明白我应该测试什么。 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库)。
此外,您也不需要自动接线所需的电线。
这将使您的测试执行起来更快,更易于阅读。
请注意,在您的代码中,ConverterContext显示为工厂而不是策略。

关于测试的逻辑,我认为不需要第二项测试。
您要检查的是工厂退回了原计划退回的物品。
断言实际不等于预期的愚蠢是完全没有用的。就像死代码一样,您必须维护...
实际上,就像您在第一个测试中断言add(1,1) == 2,而在第二个测试中断言add(2,1) != 2
为什么不断言所有预期的哑巴都不相等?
 add(2,1) != 4add(2,1) != 5add(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));
    }
}

10-06 07:11