使用传递给模拟对象的函数进行测试
Testing with functions passed to a mock object
我有一个简单的函数,最近被一些额外的逻辑包装了。我正在努力更新测试逻辑,因为突然之间,方法体被包裹在一个模拟中。
举个例子
原逻辑&测试:
// logic
public void doSomething(Transaction t, int a) {
myService.foo(t, a);
}
我的测试:
// test
TestedService service;
@Mock
MyService myService;
@Mock
Transaction t;
@Test
public void testSomething() {
testedService.doSomething(t, 10);
Mockito.verify(myService).foo(t, 10);
}
发生的事情是我们将逻辑包装在一些附加函数中:
public void doSomething(Transaction t, int a) {
model.runInEnhancedTransaction(t, t2 -> { myService.foo(t2, a) });
}
我的问题是,当逻辑突然包含在 model
方法中时,我该如何测试它(模型在我的测试中是一个模拟)。
我基本上需要验证 t2 -> { myService.foo(t2, a) }
在 model
对象是模拟对象时被调用。
编辑:为了测试目的,我实现了 model
的自定义版本,但仍然想知道是否有更优雅的方法。
测试这些类型的 lambda 调用有点困难。我所做的是执行两项测试:一项是 model.runInEnhancedTransaction()
被调用,另一项是 model.runInEnhancedTransaction()
本身。例如
@Test
void doSomethingCallsModelEnhancedTransaction() {
testedService.doSomething(t, 10);
verify(model).runInEnhancedTransaction(eq(t), any());
}
@Test
void modelRunInEnhancedTransaction() {
Transaction t = mock(Transaction.class);
BiConsumer<Transaction, Integer> consumer = mock(Biconsumer.class);
model.runInEnhancedTransaction(t, consumer);
verify(consumer).accept(...);
}
我有一个简单的函数,最近被一些额外的逻辑包装了。我正在努力更新测试逻辑,因为突然之间,方法体被包裹在一个模拟中。
举个例子
原逻辑&测试:
// logic
public void doSomething(Transaction t, int a) {
myService.foo(t, a);
}
我的测试:
// test
TestedService service;
@Mock
MyService myService;
@Mock
Transaction t;
@Test
public void testSomething() {
testedService.doSomething(t, 10);
Mockito.verify(myService).foo(t, 10);
}
发生的事情是我们将逻辑包装在一些附加函数中:
public void doSomething(Transaction t, int a) {
model.runInEnhancedTransaction(t, t2 -> { myService.foo(t2, a) });
}
我的问题是,当逻辑突然包含在 model
方法中时,我该如何测试它(模型在我的测试中是一个模拟)。
我基本上需要验证 t2 -> { myService.foo(t2, a) }
在 model
对象是模拟对象时被调用。
编辑:为了测试目的,我实现了 model
的自定义版本,但仍然想知道是否有更优雅的方法。
测试这些类型的 lambda 调用有点困难。我所做的是执行两项测试:一项是 model.runInEnhancedTransaction()
被调用,另一项是 model.runInEnhancedTransaction()
本身。例如
@Test
void doSomethingCallsModelEnhancedTransaction() {
testedService.doSomething(t, 10);
verify(model).runInEnhancedTransaction(eq(t), any());
}
@Test
void modelRunInEnhancedTransaction() {
Transaction t = mock(Transaction.class);
BiConsumer<Transaction, Integer> consumer = mock(Biconsumer.class);
model.runInEnhancedTransaction(t, consumer);
verify(consumer).accept(...);
}