Java @SpringBootTest测试类正确吗?

Java @SpringBootTest测试类正确吗?,java,spring,unit-testing,spring-boot,junit,Java,Spring,Unit Testing,Spring Boot,Junit,这是单元测试的正确本质吗?我想我不明白我应该测试什么。ConverterContext是一个策略类 @SpringBootTest @ExtendWith(SpringExtension.class) class ConverterContextTest { @Autowired private final ConverterContext converterContext; @Autowired private final ConverterRegisterU

这是单元测试的正确本质吗?我想我不明白我应该测试什么。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);
    }
}

单元测试的思想是测试尽可能小的代码片段。在大多数情况下,这意味着一个类及其方法的作用。至于要编写多少测试,这实际上取决于人。举个例子:

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());
    }
}


这项测试可能只剩下前两种方法,但为了获得更多的测试覆盖率,一个人可能会测试更多。我认为重要的是要注意到,在现实生活场景中,彻底测试每一种可能的结果是不可能的,通常会定义一个分界点

单元测试的思想是测试尽可能小的代码片段。在大多数情况下,这意味着一个类及其方法的作用。至于要编写多少测试,这实际上取决于人。举个例子:

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());
    }
}


这项测试可能只剩下前两种方法,但为了获得更多的测试覆盖率,一个人可能会测试更多。我认为重要的是要注意到,在现实生活场景中,彻底测试每一种可能的结果是不可能的,通常会定义一个分界点

我倾向于在加载Spring上下文时将其视为一个集成测试,在不加载Spring上下文时,将其视为一个单元测试,并且在没有任何上下文的情况下测试一个小方法的特定逻辑。当您试图测试一个在Spring上下文中实际依赖于其他注入bean的类时,您可以使用类似Mockito的框架来保持它们的单元测试,并防止它们成为完整的集成测试。我希望这会有所帮助。

我倾向于在加载Spring上下文时将其视为一个集成测试,而在不加载Spring上下文时,将其视为一个单元测试,并且在没有任何上下文的情况下测试一个小方法的特定逻辑。当您试图测试一个在Spring上下文中实际依赖于其他注入bean的类时,您可以使用类似Mockito的框架来保持它们的单元测试,并防止它们成为完整的集成测试。我希望这会有所帮助。

在单元测试中,您希望避免加载spring启动上下文。因此,请实例化ConverterContext。 如果ConverterContext有一些需要隔离的依赖项,可以通过Mockito库对它们进行模拟。 除此之外,您不需要自动连接预期的。 它将使您的测试执行更快,阅读更简单。 请注意,在代码转换器中,Context显示为工厂,而不是策略

关于你测试的逻辑,我认为第二次测试不是必需的。 您要检查的是,工厂是否退回了其设计退回的产品。 断言实际值不等于愚蠢的预期值是完全无用的。这就像死代码,你必须主。。。 事实上,这就像在第一个测试中断言add1,1==2,在第二个测试中断言add2,1!=2. 为什么不断言所有人都不平等? 地址2,1!=4,添加2,1!=5,添加2,1!=我们可以继续很长一段时间

我希望有一个单元测试,看起来像我使用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));
    }
}

在单元测试中,您希望避免加载spring引导上下文。因此,请实例化ConverterContext。 如果ConverterContext有一些需要隔离的依赖项,可以通过Mockito库对它们进行模拟。 除此之外,您不需要自动连接预期的。 它将使您的测试执行更快,阅读更简单。 请注意,在代码转换器中,Context显示为工厂,而不是策略

关于你测试的逻辑,我认为第二次测试不是必需的。 您要检查的是,工厂是否退回了其设计退回的产品。 断言实际值不等于愚蠢的预期值是完全无用的。这就像死代码,你必须主。。。 事实上,这就像在第一个测试中断言add1,1==2,在第二个测试中断言add2,1!=2. 为什么不断言所有人都不平等? 地址2,1!=4,添加2,1!=5,添加2,1!=我们可以继续很长一段时间

我希望有一个单元测试,看起来像我使用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));
    }
}

你在测试什么?我在测试转换器上下文是否返回正确的对象你在测试什么?我在测试转换器上下文是否返回正确的对象object@Antoniossss许多人忘记了加载Spring容器不是免费的。看起来不错,但是当转换器在构造函数依赖项中有许多参数时该怎么办?如果是ModelMapper或PasswordEncoder,我可以轻松创建实例,但如果是其他服务,我可能会遇到问题。所以,您在这里编写的代码是单元测试、集成测试或其他东西?您应该模拟在测试中造成困难或不希望的耦合的依赖关系。我更新来说明。这是一个
单元测试。@antoniosss许多人忘记了加载Spring容器不是免费的。这看起来不错,但当转换器在构造函数依赖项中有许多参数时该怎么办?如果是ModelMapper或PasswordEncoder,我可以轻松创建实例,但如果是其他服务,我可能会遇到问题。所以,您在这里编写的代码是单元测试、集成测试或其他东西?您应该模拟在测试中造成困难或不希望的耦合的依赖关系。我更新来说明。这是一个单元测试。