Java 使用模拟对象的Spring单元测试到底是如何工作的?
我正在学习Spring Core认证,我对JUnit测试中使用mock有一些疑问 我知道,与存根不同,存根中我必须实现一个接口来创建一个伪对象(我的存根),使用mock,我使用一个模拟框架(asEasyMock),为我生成一个在测试中使用的模拟对象 因此,使用模拟进行测试的步骤如下:Java 使用模拟对象的Spring单元测试到底是如何工作的?,java,spring,junit,mocking,easymock,Java,Spring,Junit,Mocking,Easymock,我正在学习Spring Core认证,我对JUnit测试中使用mock有一些疑问 我知道,与存根不同,存根中我必须实现一个接口来创建一个伪对象(我的存根),使用mock,我使用一个模拟框架(asEasyMock),为我生成一个在测试中使用的模拟对象 因此,使用模拟进行测试的步骤如下: 使用模拟库生成一个模拟对象,动态实现依赖接口 记录模拟,并期望如何将其用于场景:将调用什么方法和返回什么值 演练场景 验证是否满足模拟预期 例如,我可以使用以下测试类: import static org.easy
import static org.easymock.classextensions.EasyMock.*;
public class AuthenticatorImplTests {
// 1) Implementation of AccountRepository interface is created:
private AccountRepository accountRepository = createMock(AccountRepository.class);
private AuthenticatorImpl authenticator = new AuthenticatorImpl(accountRepository);
@Test
public void validUserWithCorrectPassword() {
// 2) RECORDING: What behavior to expect?
expect(accountRepository.getAccount(“lisa”)).andReturn(new Account(“lisa”, “secret”));
// Recording Playback (???)
replay(accountRepository);
// 3) Excercise the scenario:
boolean res = authenticator.authenticate(“lisa”, “secret”);
assertTrue(res);
// 4) Verify mock expectations were met
verify(accountRepository);
}
}
好的,有些事情我很清楚,但还有一些事情我不明白
会发生什么
在我看来:
replay(accountRepository);
调用是否仅用于使模拟对象可用
Tnx使用EasyMock,您通常会执行以下操作:首先创建模拟。然后记录预期行为,如果需要,返回/异常/。。。然后你把你的模拟放进重播模式。也就是说,你告诉EasyMock你已经完成了录制,现在如果你在模拟中调用一个方法,你实际上想要录制的行为。然后调用业务逻辑进行测试。之后,您进行断言,并通过调用verify确保业务逻辑正确执行了预期行为(调用mock方法)。使用EasyMock,您通常会执行以下操作:首先创建您的mock。然后记录预期行为,如果需要,返回/异常/。。。然后你把你的模拟放进重播模式。也就是说,你告诉EasyMock你已经完成了录制,现在如果你在模拟中调用一个方法,你实际上想要录制的行为。然后调用业务逻辑进行测试。之后,您进行断言,并通过调用verify确保业务逻辑正确执行了预期行为(调用mock方法)。使用EasyMock,您通常会执行以下操作:首先创建您的mock。然后记录预期行为,如果需要,返回/异常/。。。然后你把你的模拟放进重播模式。也就是说,你告诉EasyMock你已经完成了录制,现在如果你在模拟中调用一个方法,你实际上想要录制的行为。然后调用业务逻辑进行测试。之后,您进行断言,并通过调用verify确保业务逻辑正确执行了预期行为(调用mock方法)。使用EasyMock,您通常会执行以下操作:首先创建您的mock。然后记录预期行为,如果需要,返回/异常/。。。然后你把你的模拟放进重播模式。也就是说,你告诉EasyMock你已经完成了录制,现在如果你在模拟中调用一个方法,你实际上想要录制的行为。然后调用业务逻辑进行测试。之后,您进行断言,并通过调用verify确保业务逻辑正确执行了预期行为(调用mocks方法) 现在我有了第一个疑问:下面这句话到底是什么意思
replay(accountRepository);
模拟对象的生命周期分为两个阶段:
replay(mockObject)
调用将模拟从一个阶段移动到另一个阶段
因为我认为,如果单元测试通过(“绿色条”),该怎么办
或未通过(“红色条”)是前一个断言的结果,为什么
测试端调用这个verify()方法并将模拟的
对象你认为这个方法怎么样
这是错误的。仅凭资产true(res)不足以判断测试是否成功
使用您的示例,假设在像authenticator.authenticate(“lisa”、“secret”)一样被调用时,验证器返回预期结果,但不在内部调用存储库。考试应该通过吗?不是,这就是您使用重播(accountRepository)
检查的内容
现在我有了第一个疑问:下面这句话到底是什么意思
replay(accountRepository);
模拟人生有两个阶段