刚刚开始学习 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/