我的方法的 JUnit 测试

Posted

技术标签:

【中文标题】我的方法的 JUnit 测试【英文标题】:JUnit test for my method 【发布时间】:2018-12-22 04:40:35 【问题描述】:

大家好,我需要为我的方法编写单元测试。我遇到了一些麻烦,因为我是 JUnit 的新手。我需要为此方法编写一个测试。 这是我的方法

@Override
public Long countSellingOrdersInQueue(String principal) 
    List<String> states = Arrays.asList(PENDING.name(), REGULARIZED.name());
    return orderRepository.countByArticleUserIdAndStateIn(principal, states);

我尝试了,但我被阻止了,这是我的结果

附:测试通过了,但我不明白我的测试是否正确

@MockBean
private OrderRepository orderRepository;

private String principal ;

@Test
public void countSellingOrdersInQueueTest()
    orderService.countSellingOrdersInQueue(principal);
    List<String> states = Arrays.asList(PENDING.name(), REGULARIZED.name());
    orderRepository.countByUserIdAndStateIn(principal,states);

【问题讨论】:

为什么要在测试中复制被测方法的代码?如果您真的必须这样做,那将是难以置信的脆弱:如果您更改代码而不更改测试怎么办?测试应该调用方法本身。 你好,安迪,谢谢你的评论 :) 那么完美的解决方案是什么? 你对编写单元测试的理解显然有一些基本的差距。我建议您在担心“完美解决方案”之前花时间阅读一些教程。 【参考方案1】:

在您的情况下,它只是单元测试,您不需要使用@MockBean,因为它会加载上下文。单元测试旨在更快地运行,使用@MockBean,将加载上下文并需要时间来完成测试。 Here 是关于何时使用@Mock 以及何时使用@MockBean 的建议。

正如 Maxim 所说,测试中没有断言。这就是测试没有失败的原因。

编写测试时要记住的几件事。

测试被视为代码的文档,它应该更具可读性,以便其他人理解代码。 如前所述,单元测试是为了提供更快的反馈 在测试中具有 AAA(排列、动作、断言)结构。更多信息here

代码如下:

public class OrderServiceTest 

    @InjectMocks
    private OrderService orderService;

    @Mock
    private OrderRepository orderRepository;

    @Before
    public void setUp() throws Exception 
        initMocks(this);
    

    @Test
    public void countSellingOrdersInQueueTest()
        when(orderRepository.countByArticleUserIdAndStateIn(any(), any())).thenReturn(1L);
        String principal = "dummyString";

        Long actualCount = orderService.countSellingOrdersInQueue(principal);

        List<String> expectedStates = Arrays.asList("State 1", "State 2");
        assertThat(actualCount, is(1L));
        verify(orderRepository).countByArticleUserIdAndStateIn(principal, expectedStates);
    

【讨论】:

好答案!当提到 unit test verify behavior,not code... 时会很完美 谢谢蒂莫西!!抱歉,实际上无法理解你的意思。你能解释一下吗?会相应更新 请参考我的这个答案:***.com/a/51153233/7023245希望它足够清楚。【参考方案2】:

测试通过,因为您没有任何检查结果的断言。您只需调用无异常执行的方法。

简单测试示例:

    @Test
    public void test() 
        assertEquals(true, true);
    

在您的情况下,测试将如下所示:

    @Test
    public void countSellingOrdersInQueueTest()
        orderService.countSellingOrdersInQueue(principal);
        List<String> states = Arrays.asList(PENDING.name(), REGULARIZED.name());
        orderRepository.countByUserIdAndStateIn(principal,states);
        assertEquals(10, orderRepository.countByUserIdAndStateIn(principal,states));//10 replace to expectetion count
        //add some more checks
    

【讨论】:

以上是关于我的方法的 JUnit 测试的主要内容,如果未能解决你的问题,请参考以下文章

为带有数组的方法编写 JUnit 测试的步骤是啥?

记录运行 JUnit 测试所需的时间

SpringBoot Junit 测试主要方法

Junit单元测试

如何使用 JUnit 测试 Spring Boot aspectj 方法?

为 Junit 测试克隆现有数据库的最佳方法?