Java 使用传递给模拟对象的函数进行测试

Java 使用传递给模拟对象的函数进行测试,java,junit,mockito,Java,Junit,Mockito,我有一个简单的函数,它最近被一些附加逻辑包装起来。我正在努力更新测试逻辑,因为突然间,方法体被包装在一个模拟中 让我给你举个例子 前逻辑与测试: // logic public void doSomething(Transaction t, int a) { myService.foo(t, a); } 还有我的测试: // test TestedService service; @Mock MyService myService; @Mock Transaction t; @Tes

我有一个简单的函数,它最近被一些附加逻辑包装起来。我正在努力更新测试逻辑,因为突然间,方法体被包装在一个模拟中

让我给你举个例子

前逻辑与测试:

// 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
方法中(model在我的测试中是一个mock)时,我如何测试这一点

我基本上需要验证
t2->{myService.foo(t2,a)}
是在
model
对象是模拟对象时调用的


编辑:为了测试的目的,我实现了我的自定义版本的
模型
,但仍然想知道是否有更优雅的方法。

测试这类lambda调用有点困难。我要做的是执行两个测试:一个是调用
model.runinehancedtransaction()
,另一个是调用
model.runinehancedtransaction()
本身。乙二醇

@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(...);
}
@测试
void doSomethingCallsModelEnhancedTransaction()无效{
测试服务剂量(t,10);
验证(模型)。运行InEnhancedTransaction(eq(t),any());
}
@试验
作废模型RunInEnhancedTransaction(){
事务t=mock(Transaction.class);
BiConsumer consumer=mock(BiConsumer.class);
模型.RunineHancedTransaction(t,消费者);
验证(消费者)。接受(…);
}

测试这类lambda调用有点困难。我要做的是执行两个测试:一个是调用
model.runinehancedtransaction()
,另一个是调用
model.runinehancedtransaction()
本身。乙二醇

@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(...);
}
@测试
void doSomethingCallsModelEnhancedTransaction()无效{
测试服务剂量(t,10);
验证(模型)。运行InEnhancedTransaction(eq(t),any());
}
@试验
作废模型RunInEnhancedTransaction(){
事务t=mock(Transaction.class);
BiConsumer consumer=mock(BiConsumer.class);
模型.RunineHancedTransaction(t,消费者);
验证(消费者)。接受(…);
}

型号
来自哪里?它只是类中注入的另一项服务,与
MyService
的方式相同。在测试中,它是一个模拟。
模型
来自哪里?它只是类中注入的另一个服务,与
MyService
的方式相同。在测试中,它是一个模拟。