将一个MockBean注入另一个

时间:2019-10-23 13:21:40

标签: spring mocking junit5

我有一个典型的SpringApplication,正在尝试通过MockMvc进行测试。该应用程序包含一些数据库调用和一些thripparty api调用,我想在测试端到端流(所有第三方除外)时模拟所有这些调用

这是我创建的-

控制器类

public class PortfolioController {

private final PortfolioService portfolioService;
}

服务等级

public class PortfolioService {

private final PortfolioTransactionRepository portfolioTransactionRepository;
private final AlphavantageService alphavantageService;
}

AlphaVantageService

public class AlphavantageService {

private ApiConfig apiConfig;

private final RestTemplate restTemplate;

public Map<String, List<Candle>> getStockQuotes(List<String> symbols) {
    return symbols.stream().collect(Collectors.toMap(symbol -> symbol, symbol -> getQuotes(symbol)));
}
}

现在来测试-

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = PortfolioController.class)
class PortfolioControllerTest {

private List<PortfolioTransaction> transactions;

@MockBean
private AlphavantageService alphavantageService;

@MockBean
private PortfolioService portfolioService;

@Autowired
private PortfolioController portfolioController;

@Autowired
private MockMvc mockMvc;
}

问题是,当我尝试在服务器上执行任何mvc调用时,AlphaVantageService未被注入到PortfolioService内,因此直到level1之前,我都注入了bean,但在更进一步的级别上,我没有一样。

是设计使然,还是我缺少了什么?我们应该如何测试这样的测试用例?

1 个答案:

答案 0 :(得分:0)

实际上,在到处都尝试了一些选项之后,我找到了解决方案。

spring和n一样,也有一个叫做s的概念。那解决了我的问题。所以现在我的测试如下所示

@MockBean

这就像一个魅力,我可以在测试中使用完整的依赖注入。