Junit and Mockito for ATG



我创建了一个类,它扩展了CommerceItemManager并覆盖了createCommerceItem方法。现在我想为这个班写一个junit和Mockito测试。以下是测试类的基本逻辑:

public class CustomizeCommerceItemManagerTest {
@Spy @InjectMocks CustomizeCommerceItemManager commerceItemManager;
@Before
public void setUp(){
initMocks(this);
}
@Test
public void shouldDoSomething(){
}
}

但当我运行这个类时,它会抛出一个异常:

java.lang.ExceptionInInitializerError位于atg.nucles.logging.ClassLoggingFactory.getFactory(ClassLoggingFactory.java:106)在atg.core.i18n.LayeredResourceBundle.(LayeredRResourceBundle.java:153)在atg.commerce.order.CommerceItemManager.(CommerceItemManager.java:93)在sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessor Impl.java:62)

引起原因:java.util.MissingResourceException:找不到的捆绑包基本名称为g.nucleus.NucleusResources,区域设置为en_USjava.util.ResourceBundle.sthrowMissingResourceException(ResourceBundle.java:1564)位于java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387)位于java.util.ResourceBundle.getBundle(ResourceBundle.java:845)atg.nucleus.GenericContext.(GenericContext.java:113)。。。46更多

我发现CommerceItemManager内部有一个参数:

protected static ResourceBundle sResourceBundle = LayeredResourceBundle.getBundle("atg.commerce.order.OrderResources", LangLicense.getLicensedDefault());

我试过用PorwerMock来模拟这个参数,但它没有帮助。

@RunWith(PowerMockRunner.class)
@PrepareForTest({LayeredResourceBundle.class})
public class CustomizeCommerceItemManagerTest {
private CustomizeCommerceItemManager commerceItemManager;
@Before
public void setUp() {
mockStatic(LayeredResourceBundle.class);
when(LayeredResourceBundle.getBundle("atg.commerce.order.OrderResources", LangLicense.getLicensedDefault())).thenReturn(null);
commerceItemManager = PowerMockito.spy(new CustomizeCommerceItemManager());
}
@Test
public void shouldDoSomething() {
}
} 

有人能给我一个建议吗?

我遇到了类似的问题,并像您一样使用Powermock并创建了一个假的ResourceBundle来解决它。

@Before
public void setUp() throws Exception {
ResourceBundle resourceBundle = new ResourceBundle() {
@Override
protected Object handleGetObject(String key) {
return "fake_translated_value";
}
@Override
public Enumeration<String> getKeys() {
return Collections.emptyEnumeration();
}
};
mockStatic(LayeredResourceBundle.class);
when(LayeredResourceBundle.getBundle(anyString(), any(java.util.Locale.class))).thenReturn(resourceBundle);
}

希望这能有所帮助。

最新更新