Hybris. 由于 NPE 异常 Item.getImplementation() 未找到,无法运行任何测试。

huangapple go评论121阅读模式
英文:

Hybris. Couldn't run any test because of NPE exception Item.getImplementation() not found

问题

我在本地运行Hybris。但在运行测试时出现错误:

java.lang.NullPointerException: 无法调用"de.hybris.platform.jalo.Item$ItemImpl.isLocalCachingSupported()",因为"de.hybris.platform.jalo.Item.getImplementation()"的返回值为null

ProductData的setter代码行中:

  1. public void setCode(final SessionContext ctx, final String value)
  2. {
  3. setProperty(ctx, "code".intern(), value);
  4. }

集成测试和单元测试都返回错误。

在此之前,使用ant yunitinit有帮助。但这次我甚至尝试了ant clean allant initialize,但没有任何改变。

这是我添加的项目类型。它生成了正确的表和类。

  1. <itemtype code="ProductData" autocreate="true" generate="true">
  2. <deployment table="ProductData" typecode="30800"/>
  3. <attributes>
  4. <attribute qualifier="code" type="java.lang.String">
  5. <persistence type="property"/>
  6. <modifiers read="true" write="true" search="true"/>
  7. </attribute>
  8. <attribute qualifier="weight" type="java.lang.Double">
  9. <persistence type="property"/>
  10. <modifiers read="true" write="true" search="true" optional="true"/>
  11. </attribute>
  12. <attribute qualifier="height" type="java.lang.Double">
  13. <persistence type="property"/>
  14. <modifiers read="true" write="true" search="true" optional="true"/>
  15. </attribute>
  16. <attribute qualifier="length" type="java.lang.Double">
  17. <persistence type="property"/>
  18. <modifiers read="true" write="true" search="true" optional="true"/>
  19. </attribute>
  20. <attribute qualifier="width" type="java.lang.Double">
  21. <persistence type="property"/>
  22. <modifiers read="true" write="true" search="true" optional="true"/>
  23. </attribute>
  24. </attributes>
  25. </itemtype>

以及测试类本身:

  1. package com.epam.trainingextension.setup.populator;
  2. import com.epam.trainingextension.enums.ProductOption;
  3. import com.epam.trainingextension.jalo.ProductData;
  4. import de.hybris.bootstrap.annotations.IntegrationTest;
  5. import de.hybris.bootstrap.annotations.UnitTest;
  6. import de.hybris.platform.core.Registry;
  7. import de.hybris.platform.core.model.product.ProductModel;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import org.junit.runner.RunWith;
  11. import org.mockito.InjectMocks;
  12. import org.mockito.Mock;
  13. import org.mockito.junit.MockitoJUnitRunner;
  14. import org.springframework.jdbc.core.JdbcTemplate;
  15. import java.util.Collections;
  16. import java.util.concurrent.TimeUnit;
  17. import static org.junit.Assert.assertEquals;
  18. import static org.junit.Assert.assertNull;
  19. import static org.mockito.Mockito.when;
  20. @RunWith(MockitoJUnitRunner.class)
  21. public class ProductPopulatorTest {
  22. @InjectMocks
  23. private ProductPopulator productPopulator;
  24. @Mock
  25. private ProductModel productModel;
  26. @Test
  27. public void testPopulate_whenPhysicalDimensionsOptionIsPassed_shouldPopulateWeight() {
  28. when(productModel.getCode()).thenReturn("productCode");
  29. when(productModel.getWeight()).thenReturn(100.0);
  30. final ProductData productData = new ProductData();
  31. productPopulator.populate(productModel, productData, Collections.singletonList(ProductOption.PHYSICAL_DIMENSIONS));
  32. assertEquals("productCode", productData.getCode());
  33. assertEquals(100.0, productData.getWeight(), 0.0);
  34. }
  35. }

测试是通过的,但我更改了ProductData的声明。我使用了items.xml,而不仅仅是在包中声明类。我想也许这里有孤立的部分,但我没有找到。

错误的原因是我已经在数据库中有ProductData,并且我从items.xml中删除了ProductData的声明,如答案建议的,而是声明了类。

英文:

I run Hybris locally. But I'm getting error while running tests:

> java.lang.NullPointerException: Cannot invoke "de.hybris.platform.jalo.Item$ItemImpl.isLocalCachingSupported()" because the return value of "de.hybris.platform.jalo.Item.getImplementation()" is null

at ProductData setter code lines:

  1. public void setCode(final SessionContext ctx, final String value)
  2. {
  3. setProperty(ctx, &quot;code&quot;.intern(),value);
  4. }

Integration and Unit test are same returns errors.

Before that ant yunitinit helped me. But this time I even have tried ant clean all, ant initialize but no changings.

It's my added item type. It generated correct table and class.

  1. &lt;itemtype code=&quot;ProductData&quot; autocreate=&quot;true&quot; generate=&quot;true&quot;&gt;
  2. &lt;deployment table=&quot;ProductData&quot; typecode=&quot;30800&quot;/&gt;
  3. &lt;attributes&gt;
  4. &lt;attribute qualifier=&quot;code&quot; type=&quot;java.lang.String&quot;&gt;
  5. &lt;persistence type=&quot;property&quot;/&gt;
  6. &lt;modifiers read=&quot;true&quot; write=&quot;true&quot; search=&quot;true&quot;/&gt;
  7. &lt;/attribute&gt;
  8. &lt;attribute qualifier=&quot;weight&quot; type=&quot;java.lang.Double&quot;&gt;
  9. &lt;persistence type=&quot;property&quot;/&gt;
  10. &lt;modifiers read=&quot;true&quot; write=&quot;true&quot; search=&quot;true&quot; optional=&quot;true&quot;/&gt;
  11. &lt;/attribute&gt;
  12. &lt;attribute qualifier=&quot;height&quot; type=&quot;java.lang.Double&quot;&gt;
  13. &lt;persistence type=&quot;property&quot;/&gt;
  14. &lt;modifiers read=&quot;true&quot; write=&quot;true&quot; search=&quot;true&quot; optional=&quot;true&quot;/&gt;
  15. &lt;/attribute&gt;
  16. &lt;attribute qualifier=&quot;length&quot; type=&quot;java.lang.Double&quot;&gt;
  17. &lt;persistence type=&quot;property&quot;/&gt;
  18. &lt;modifiers read=&quot;true&quot; write=&quot;true&quot; search=&quot;true&quot; optional=&quot;true&quot;/&gt;
  19. &lt;/attribute&gt;
  20. &lt;attribute qualifier=&quot;width&quot; type=&quot;java.lang.Double&quot;&gt;
  21. &lt;persistence type=&quot;property&quot;/&gt;
  22. &lt;modifiers read=&quot;true&quot; write=&quot;true&quot; search=&quot;true&quot; optional=&quot;true&quot;/&gt;
  23. &lt;/attribute&gt;
  24. &lt;/attributes&gt;
  25. &lt;/itemtype&gt;

And test class itself:

  1. package com.epam.trainingextension.setup.populator;
  2. import com.epam.trainingextension.enums.ProductOption;
  3. import com.epam.trainingextension.jalo.ProductData;
  4. import de.hybris.bootstrap.annotations.IntegrationTest;
  5. import de.hybris.bootstrap.annotations.UnitTest;
  6. import de.hybris.platform.core.Registry;
  7. import de.hybris.platform.core.model.product.ProductModel;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import org.junit.runner.RunWith;
  11. import org.mockito.InjectMocks;
  12. import org.mockito.Mock;
  13. import org.mockito.junit.MockitoJUnitRunner;
  14. import org.springframework.jdbc.core.JdbcTemplate;
  15. import java.util.Collections;
  16. import java.util.concurrent.TimeUnit;
  17. import static org.junit.Assert.assertEquals;
  18. import static org.junit.Assert.assertNull;
  19. import static org.mockito.Mockito.when;
  20. @RunWith(MockitoJUnitRunner.class)
  21. public class ProductPopulatorTest {
  22. @InjectMocks
  23. private ProductPopulator productPopulator;
  24. @Mock
  25. private ProductModel productModel;
  26. @Test
  27. public void testPopulate_whenPhysicalDimensionsOptionIsPassed_shouldPopulateWeight()
  28. {
  29. when(productModel.getCode()).thenReturn(&quot;productCode&quot;);
  30. when(productModel.getWeight()).thenReturn(100.0);
  31. final ProductData productData = new ProductData();
  32. productPopulator.populate(productModel, productData, Collections.singletonList(ProductOption.PHYSICAL_DIMENSIONS));
  33. assertEquals(&quot;productCode&quot;, productData.getCode());
  34. assertEquals(100.0, productData.getWeight(), 0.0);
  35. }
  36. }

Test was green, but I've changed declaration of ProductData. I used items.xml instead of just usual declaration of class in packages. I thought maybe here was left orphans, but I don't have one.

Cause of error was that I had already ProductData in db, and I removed declaration of ProductData from items.xml how suggested in answers, and declared class instead

答案1

得分: 2

如果您想使用items.xml中的ProductData,您应该使用ProductDataModel而不是ProductData。

英文:

If you want to use ProductData from items.xml you should be using ProductDataModel instead of ProductData.

huangapple
  • 本文由 发表于 2023年2月7日 02:28:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/75365243.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定