【问题标题】:Junit and Mockito for ATG用于 ATG 的 Junit 和 Mockito
【发布时间】:2019-01-20 19:57:39
【问题描述】:

我创建了一个类,它扩展了 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.nucleus.logging.ClassLoggingFactory.getFactory(ClassLoggingFactory.java:106) 在 atg.core.i18n.LayeredResourceBundle.(LayeredResourceBundle.java:153) 在 atg.commerce.order.CommerceItemManager.(CommerceItemManager.java:93) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

原因:java.util.MissingResourceException:找不到捆绑包 基本名称 atg.nucleus.NucleusResources,语言环境 en_US 位于 java.util.ResourceBundle.throwMissingResourceException(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() {
    }
} 

谁能给我一个建议?

【问题讨论】:

  • 似乎在抱怨缺少 en_US 资源包。您能确认这是您的代码返回的捆绑包吗?

标签: java atg


【解决方案1】:

我有类似的问题,并通过像你一样使用 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);
}

希望这能有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多