我正在测试一种方法protected。在我的测试案例中,我曾经使用Reflection过该方法,但是我不确定自己是否以正确的方式进行操作。
测试方法:
protected void checkORCondition( Map<String, Message> messagesMap ) throws EISClientException
{
Message message = containsAMessageCode(getMessageCodes(), messagesMap);
if(message!=null)
{
throw new EISClientException("One of the specified message code matched returned errors." +
message.getMessageCode() + ": " + message.getMessageType() + ": " + message.getMessageText());
}
}
Run Code Online (Sandbox Code Playgroud)
JUnit测试用例:
@Test
public void testcheckORCondition() throws Exception {
Class clazz = MessageToExceptionPostProcessFilter.class;
Object object = clazz.newInstance();
Method method = clazz.getDeclaredMethod("checkORCondition", new Class[]{Map.class});
method.setAccessible(true);
String string = new String();
string = "testing";
Message message = new Message();
message.setMessageCode("200");
Map<String, Message> map = new HashMap<String, Message>();
map.put(string, message);
assertEquals("testing", string);
assertEquals("200", message.getMessageCode());
}
Run Code Online (Sandbox Code Playgroud)
我的JUnit通过了,但不确定是否在方法内部。
使用反射从单元测试访问受保护的方法似乎很笨拙。有几种更简单的方法可以做到这一点。
最简单的方法是确保您的测试与您正在测试的类位于相同的包层次结构中。如果这是不可能的,那么您可以子类化原始类并创建一个调用受保护方法的公共访问器。
如果它是一次性的,那么它甚至可以像创建一个匿名类一样简单。
您要测试的类:
public class MessageToExceptionPostProcessFilter {
protected void checkOrCondition(Map<String, Message> messagesMap) throws EISClientException {
// Logic you want to test
}
}
Run Code Online (Sandbox Code Playgroud)
还有你的测试课:
public class MessageToExceptionPostProcessFilterTest {
@Test
public void testCheckOrCondition() throws Exception {
String string = "testing";
Message message = new Message();
message.setMessageCode("200");
Map<String, Message> map = new HashMap<>();
map.put(string, message);
MessageToExceptionPostProcessFilter filter = new MessageToExceptionPostProcessFilter() {
public MessageToExceptionPostProcessFilter callProtectedMethod(Map<String, Message> messagesMap) throws EISClientException {
checkOrCondition(messagesMap);
return this;
}
}.callProtectedMethod(map);
// Assert stuff
}
}
Run Code Online (Sandbox Code Playgroud)