假設你ProjectModel
類是在包privateaccessor.tst
並且您的非靜態方法model
返回int
。
package privateaccessor.tst;
public class ProjectModel {
//some code
private static class MyStaticClass{
private int model (Object obj, Map<String , Object> model) {
return 42;
}
}
}
然後在您的測試,你可以使用反射來獲取私有類Class
對象,並創建一個實例。然後您可以使用PrivateAccessor
(包含在Junit Addons中)調用方法model()
。
@Test
public void testPrivate() throws Throwable {
final Class clazz = Class.forName("privateaccessor.tst.ProjectModel$MyStaticClass");
// Get the private constructor ...
final Constructor constructor = clazz.getDeclaredConstructor();
// ... and make it accessible.
constructor.setAccessible(true);
// Then create an instance of class MyStaticClass.
final Object instance = constructor.newInstance();
// Invoke method model(). The primitive int return value will be
// wrapped in an Integer.
final Integer result = (Integer) PrivateAccessor.invoke(instance, "model", new Class[]{Object.class, Map.class}, new Object[]{null, null});
assertEquals(42, result.intValue());
}
首先你應該問自己:我真的需要爲私有方法編寫單元測試嗎?如果你想測試它們,你不應該直接測試它們,而應該通過使用它們的公共方法來測試它們。 – Stultuske
有兩件事:1:這不會編譯,因爲'model()'沒有返回類型。 2:私有方法不需要測試。相反,你應該確保使用這個非私有方法返回正確的結果。 – Dragondraikk
您正在從外部類獲取聲明的方法。 – Mena