【问题标题】:Java - JUnit Mockito method approachJava - JUnit Mockito 方法方法
【发布时间】: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();

【问题讨论】:

    标签: java unit-testing spring-boot junit mocking


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多