Cucumber 和 Mockito - 无法初始化模拟

Cucumber and Mockito - Unable to initialize mocks

我正在将 mockito 与 cucumber 一起使用,其中 mocks 和 stepdefinitions 都定义在一个 class 中,工作正常。我现在希望将我的代码重构为更小的步骤定义 classes,而是通过每个 stepDefinition class 中的静态助手访问我的模拟。我的问题是,当它们与我的 stepDefinitions classes 分开时,我无法初始化我的模拟。

模块:

cucumber-junit 4.8.0
cucumber-java 4.8.0
mockito-core 3.3.3

我想做这样的事情:

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "html:target/cucumber"},
        features = {"src/test/resources/features"},
        glue = {"bdd.steps"},
        monochrome = true)
public class RunCucumberTest {
}


public class MockDataHelper{
  @Mock private BookService bookService;

  @Getter
  private static Library library;

  @Before
  public void before() {
        MockitoAnnotations.initMocks(this);
        library = new Library(bookService);
  }

package bdd.steps;
public class StepsA {
  @Given("..") {
   ...
  @When("..") {
    MockDataWrapper.getLibrary().rentBook(..);
}

package bdd.steps;
public class StepsB {
  @Given("..")
   ...
}

我可以用工厂方法实现我想要的,但我希望有一个更优雅的解决方案..

public Library getLibrary(){
    if(library == null){
        library = new Library(mock(bookService.class));
    }
    return library;
}

非常感谢任何帮助

Cucumber 支持各种依赖注入容器。如果您添加 cucumber-pico 作为依赖项,您所要做的就是声明一个构造函数。当您使用 Lombok 时,这是添加 @RequiredArgConstructor.

的问题
@RequiredArgConstructor
public class StepsA {

  private final MockDataWrapper wrapper

  @When("..") {
    wrapper.getLibrary().rentBook(..);
  }

}

请确保 MockDataHelper 在粘合路径上。否则 @Before 挂钩将不会被触发。