Java 如果无法验证,如何检查测试用例

Java 如果无法验证,如何检查测试用例,java,testing,junit,mockito,Java,Testing,Junit,Mockito,我正在学习单元测试,我遇到了一个问题,创建了一个测试用例是否正确的最终检查。通常我会尝试创建一个验证,比如通过assertEquals()。但是当不可能像这样测试它时,建议做什么呢 我有一门课是这样的: public class Landlord { private Map<String, ChannelHandlerContext> currentOccupier; private static Landlord instance; public Lan

我正在学习单元测试,我遇到了一个问题,创建了一个测试用例是否正确的最终检查。通常我会尝试创建一个验证,比如通过
assertEquals()
。但是当不可能像这样测试它时,建议做什么呢

我有一门课是这样的:

public class Landlord {

    private Map<String, ChannelHandlerContext> currentOccupier;
    private static Landlord instance;

    public Landlord() {
        currentOccupier = new HashMap<>();
    }

    public static Landlord getInstance {
        //return instance
    }

    public void add(Occupier occupier){
        currentOccupier.put("test", occupier.getChannelHandlerContext());    
    }
}
public class LandlordTest {

    private Landlord landlord;
    @Mock
    private Occupier occupier;
    @Mock
    private ChannelHandlerContext channelHandlerContext;


    @BeforeEach
    void setUp() {
        occupier = mock(Occupier.class);
        channelHandlerContext = mock(ChannelHandlerContext.class);

        landlord = Landlord.getInstance();

        when(occupier.getChannelHandlerContext()).thenReturn(channelHandlerContext);
    }

    public void add(Occupier occupier){
        addedOccupier.put(occupier.getChannelHandlerContext()); 
        //adding succeded
    }

}
也许在这个简短的示例中,不需要对其进行测试,但是有没有办法验证add方法是否成功?通常在这种情况下,我会尝试以下操作:
assertEquals(currentOccupier.size(),1)
,但在这里,我无法访问实例的hashMap来这样做。是否有其他方法来验证添加它的正确行为

assertEquals(currentOccupier.size(),1)
确实不够。
您希望声明映射包含您在映射中添加的条目。
该断言太肤浅:它既不检查项,也不检查键的值,也不检查值的值。
你应该这样做:

ChannelHandlerContext actualContext = landLord.get("test");
assertSame(addedContext, actualContext);
// or assertEquals if the instances may differ because you do some defensive copy in add()
还要注意,您在这里模拟了一些不需要模拟的东西:
occupier
channelHandlerContext
成为您模型的一部分。您应该能够在测试框架中提供它们的“正常”实例

在这里,您有两种方法来实现这一点:

1) 将类中的公共方法添加到被测对象以查找
ChannelHandlerContext

public ChannelHandlerContext get(String name){
    currentOccupier.get(name);    
}
如果提供此访问权限是可接受的,则仅执行此操作。
如果无法添加公共方法,请添加包级别的方法,因为这不会成为公开API的一部分

2) 使用反射api(本质上是
Class.getDeclaredField(String)
Field.get()
)从被测实例检索映射实例,然后断言它包含“test”键的预期
ChannelHandlerContext
实例

assertEquals(currentOccupier.size(),1)
确实不够。
您希望声明映射包含您在映射中添加的条目。
该断言太肤浅:它既不检查项,也不检查键的值,也不检查值的值。
你应该这样做:

ChannelHandlerContext actualContext = landLord.get("test");
assertSame(addedContext, actualContext);
// or assertEquals if the instances may differ because you do some defensive copy in add()
还要注意,您在这里模拟了一些不需要模拟的东西:
occupier
channelHandlerContext
成为您模型的一部分。您应该能够在测试框架中提供它们的“正常”实例

在这里,您有两种方法来实现这一点:

1) 将类中的公共方法添加到被测对象以查找
ChannelHandlerContext

public ChannelHandlerContext get(String name){
    currentOccupier.get(name);    
}
如果提供此访问权限是可接受的,则仅执行此操作。
如果无法添加公共方法,请添加包级别的方法,因为这不会成为公开API的一部分


2) 使用反射api(本质上是
Class.getDeclaredField(String)
Field.get()
)从被测实例检索映射实例,然后断言它包含“test”键的预期
ChannelHandlerContext
实例

所以仅仅测试用户是否被添加到列表中还不够?还需要检查什么,比如验证用户是否真的是相同的?完全正确。我更新了一个简单的例子来说明。非常感谢你,你帮助了我!所以仅仅测试用户是否被添加到列表中还不够?还需要检查什么,比如验证用户是否真的是相同的?完全正确。我更新了一个简单的例子来说明。非常感谢你,你帮助了我!