java-测试-使用内部私有方法的lambda?

java-测试-使用内部私有方法的lambda?,java,unit-testing,testing,lambda,private,Java,Unit Testing,Testing,Lambda,Private,我对以下方法的单元测试有一些问题 public List<GetSupplyChainResponse> getSupplyChains(){ List<GetSupplyChainsResponse> response = new ArrayList<>(); supplyChainRepository.findSupplyChainsWithCompound().forEach(result -> respon

我对以下方法的单元测试有一些问题

public List<GetSupplyChainResponse> getSupplyChains(){
    List<GetSupplyChainsResponse> response = new ArrayList<>();
    supplyChainRepository.findSupplyChainsWithCompound().forEach(result
            -> response.add(getGetSupplyChainSimpleResponse(result)));

    return response;
}
public List getSupplyChains(){
列表响应=新建ArrayList();
supplyChainRepository.FindSupplyChainWithCompound().forEach(结果
->add(getSupplyChainSimpleResponse(result));
返回响应;
}
getGetSupplyChainSimpleResponse()
是与getSupplyChains()相同类的私有方法


因此,是否有可能定义返回值,或者您是否有其他想法如何测试方法
getSupplyChains()

这是一个经常讨论的问题,一些人更喜欢使用反射作为Janos Binder的推荐(),有些人可以接受这样一个事实:为了可测试性,我们需要模拟的方法的可见性增加了

这个问题在这里讨论得很好:。您可以从答案和广泛的讨论中看到,这个主题相当复杂,开发人员分成不同的派别并使用不同的解决方案

我建议您删除
private
access修饰符,并将方法包设置为private(使用默认可见性)。常见的习惯是将测试类与测试类放在同一个包中(但不在同一个文件夹中!)

这将允许您:

  • 测试
    getGetSupplyChainSimpleResponse()
    方法本身,无论如何都应该这样做

  • 模拟其行为以测试
    getSupplyChains()
    。您将通过使用Mockito框架及其应用程序来实现这一点


  • 对于那些认为这是“为了测试而牺牲您的设计”的人,我会回答,如果您有需要模拟和/或测试的私有方法,那么设计无论如何都不是理想的,因此将可见性更改为包私有并不意味着太大的劣化。明确的解决方案(从面向对象设计的角度来看)是将此类私有方法的行为委托给单独的类。然而,在现实生活中,有时这只是过火。

    你可能想得太多了。您想要测试的方法(
    getSupplyChains
    )使用调用私有方法的lambda这一事实是不相关的:它们只是实现细节

    单元测试是作为客户机与之交互的类的一部分,即它的接口。您通常使用一些参数调用公共方法(在本例中没有参数),您会得到一些返回值,这就是您在单元测试中验证的内容。如果您的公共方法使用了某些私有方法,那么也将对其进行测试

    这里的问题是,您从
    getSupplyChains
    得到的响应显然取决于
    supplyChainRepository.findsupplychainswithcomposite()
    返回的内容。在本例中,您所做的是模拟该依赖项(
    supplyChainRepository
    ):您创建了一个
    supplyChainRepository
    的模拟实例,告诉它如何操作,然后将其传递给该类,例如通过构造函数

    您可以自己编写mock,也可以依靠mock框架来完成类似的繁重工作


    我绝对建议不要对私有方法进行单元测试(这会导致脆弱的测试),或者增加这些方法的可见性(即为了测试而牺牲设计)。

    您可以使用反射。看到了吗?你有什么问题?你有什么错误吗?也许您还想显示
    getSupplyChainSimpleResponse()
    方法,这样我们就可以看到里面发生了什么。您测试方法
    getSupplyChains()
    与测试方法完全相同,如果没有lambda表达式调用
    private
    方法。