Java - JUnit Mockito 方法方法

标签 java unit-testing spring-boot junit mocking

刚刚开始学习 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);
}

我应该在之前创建一些 byte[] 并继续生成Code参数

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

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

最佳答案

我认为您根本不需要在这里使用 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,这种方法引入了复杂性,并且没有额外的好处。我看不出这样做的正当理由。该方法是确定性的,因此我建议您让测试用例传入一个值,并断言该方法始终返回该值的预期生成输出。

关于Java - JUnit Mockito 方法方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49880302/

相关文章:

java - 如何使用 Mockito 在 java 中模拟 new Date()

c++ - 如何期待稍后创建的指针参数

java - 为什么 Redis 不在 __keyevent@*__ :expired topic events? 上调用我的 MessageListener

java - spring boot编译找不到符号componentscan

java - 意外的 token android studio弹出窗口

java - JUnit、JPA、Hibernate 和 Postgres : How to test?

angular - 如何为打开模式的 Angular Http 拦截器编写单元测试?

java - 在 App Engine Java 开发服务器中,如何模拟并发线程以确保安全?

java - 设置Swing程序的默认字体

java - 使用 Spring boot 执行 Google Cloud App 时出现问题