这是单元测试的正确本质吗?我想我不明白我应该测试什么。 ConverterContext是一个策略类
setup.py
答案 0 :(得分:5)
在单元测试中,您要避免加载spring boot上下文。因此,请实例化ConverterContext
。
如果ConverterContext
具有一些需要隔离的依赖项,则可以对其进行模拟(请参阅Mockito库)。
此外,您也不需要自动连接所需的电线。
这将使您的测试执行起来更快,更易于阅读。
请注意,在您的代码中,ConverterContext
显示为工厂而非策略。
关于测试的逻辑,我认为不需要第二项测试。
您要检查的是工厂返回了要返回的原样。
断言实际不等于预期的愚蠢是完全没有用的。就像死代码一样,您必须维护...
实际上,就像您在第一个测试中断言add(1,1)
== 2
,而在第二个测试中断言add(2,1)
!= 2
一样。
为什么不断言所有预期的哑巴都不相等?
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));
}
}
答案 1 :(得分:1)
使用单元测试的想法是测试尽可能小的代码段。在大多数情况下,这意味着类及其方法是做什么的。至于要写多少个测试,这实际上取决于人。举个例子:
public class Point2D
{
private int x, y;
public Point2D() {this.x = 0; this,y = 0;}
public int getX() {return x;}
public int getY() {return y;}
}
class Point2DTest
{
@Autowired
private final Point2D p;
@Test
void getXReturnsZero()
{
int expected = 0;
assertEquals(expected, p.getX());
}
@Test
void getYReturnsZero()
{
int expected = 0;
assertEquals(expected, p.getY());
}
@Test
void getXDoesNotReturnZero()
{
int expected = 1;
assertNotEquals(expected, p.getX());
}
@Test
void getYDoesNotReturnZero()
{
int expected = 1;
assertNotEquals(expected, p.getY());
}
}
本测试可以保留前两种方法,但是对于更多的测试覆盖范围,一个人可以进行更多测试。我认为重要的是要注意,在现实生活中不可能进行详尽的测试(测试所有可能的结果),通常会定义一个临界点。
答案 2 :(得分:1)
在加载Spring上下文时,我倾向于将它更多地看作是集成测试,而在没有加载上下文时,则将其更多地看作是单元测试,并且在没有任何上下文的情况下测试小型方法的特定逻辑。当您尝试在Spring上下文中测试实际上仅依赖于其他注入的bean的类时,可以使用Mockito之类的框架来保持它们的单元测试并防止它们成为全面的集成测试。希望对您有所帮助。