Java - JUnit Mockito 方法方法

Posted

技术标签:

【中文标题】Java - JUnit Mockito 方法方法【英文标题】:Java - JUnit Mockito method approach 【发布时间】:2018-09-27 13:12:28 【问题描述】:

刚开始学习 Mockito,我有方法可以生成一些代码,以便以后构造一些请求并存储到数据库。

是否知道如何专门使用@Mock 进行测试,或者我不需要它?

public String generateCode(byte[] input) 
    return StringUtils.join(DigestUtils.sha1Hex(input).toUpperCase();

不确定我是否理解 Mockito 是否适合这种方法...感谢您的任何建议

@Autowired
RequestUtil requestUtil; // this is where generateCode method is

@Test
public void generateSuccesCode() 
    requestUtil.generateCode(input);

我是否应该在之前创建一些字节[]并继续生成代码参数

不确定 Mocking 如何帮助我使用上述方法

StringUtils.join(DigestUtils.sha1Hex(input).toUpperCase();

【问题讨论】:

【参考方案1】:

我认为你根本不需要在这里使用 Mockito。

使用实际值(以及基于该值的期望)测试此方法很简单,并且提供了完整的覆盖范围。

例如:

@Test
public void foo() 
    RequestUtil requestUtil = new RequestUtil();

    Assert.assertEquals("0BEEC7B5EA3F0FDBC95D0DD47F3C5BC275DA8A33", requestUtil.generateCode("foo".getBytes()));

只要您对给定输入的有效输出有所期望,这种方法就可以工作。

如果您有这样的期望,那么我建议您实际传递一个值并断言响应符合此期望。

但是,如果您确实没有期望 generateCode() 应该返回什么值,因此您唯一的期望是它将调用 DigestUtils.sha1Hex() 并通过 StringUtils.join() 传递响应,那么您必须使用 PowerMock 来模拟 DigestUtils。例如:

@RunWith(PowerMockRunner.class)
@PrepareForTest(DigestUtils.class)
public class TestTest 

    private RequestUtil sut = new RequestUtil();

    @Test
    public void testGenerateCode() 
        PowerMockito.mockStatic(DigestUtils.class);

        byte[] input = "anInput".getBytes();
        final String hex = "0beec7";
        Mockito.when(DigestUtils.sha1Hex(input)).thenReturn(hex);

        String actual = sut.generateCode(input);
        Assert.assertEquals(hex.toUpperCase(), actual);
    

FWIW,这种方法引入了复杂性,但没有额外的好处。我看不出这样做的正当理由。该方法是确定性的,因此我建议您让测试用例传入一个值并断言该方法始终返回该值的预期生成输出。

【讨论】:

我已经更新了答案,试图阐明我所说的“实际价值”方法的含义,并提供了一个使用 PowerMock 模拟 generateCode() 内部的示例。 不确定在 "foo"getBytes()) 中放什么;例如,部件总是得到预期的单元错误“0BEEC7B5EA3F0FDBC95D0DD47F3C5BC275DA8A33”并且总是得到“生成一些随机字符串”,如何解决这个问题?谢谢 感谢您的建议,我会看看我能用这个 PowerMock 做什么,因为我不期望 generateCode() 应该返回什么值,它总是生成随机的十六进制字符串 DigestUtils.sha1Hex() not 返回一个随机字符串。对于任何给定的输入,它的输出都是可预测和确定的。 猜想在简单的 JUnit 方法中没有办法达到预期值和实际值......将尝试使用 PowerMock。

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

我们可以使用Mockito和PowerMock出售junit测试类

如何使用 Mockito 和 JUnit 在 Spring Boot 中测试 POST 方法

测试类时,使用 Junit 和 Mockito 检查方法内部的工作

jUnit,Mockito。如何确保抽象类(模板方法)中的方法调用抽象钩子方法?

如何使用junit和mockito为私有void方法编写测试用例[重复]

Junit mockito 测试Controller层方法有Pageable异常