gpt4 book ai didi

java - 测试自定义插件 portlet : BeanLocatorException and Transaction roll-back for services testing

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:45 25 4
gpt4 key购买 nike

我的问题:

  1. 我可以成功测试 CRUD 服务操作。我在做在@Before [setUp()] 上插入并在@After 上删除相同的数据[tearDown()] 但今后我需要支持交易而不是编写用于插入和删除的代码。

  2. 我成功获取了我的实体的单个记录,但是当我触发搜索查询或尝试获取多个实体时,我得到:

    com.liferay.portal.kernel.bean.BeanLocatorException: BeanLocator has not been set for servlet context MyCustom-portlet

我已经按照以下一些链接使用 Liferay 设置 Junit:

我的环境

  • Liferay 6.0.5 EE 与 Tomcat 捆绑在一起

  • 使用 Junit4 的 Liferay IDE 1.4 和 Eclipse Helios

  • 我在 eclipse 本身中使用“ant”命令运行我的测试,但没有通过键入 Alt+Shift+X, T

如果我能了解如何使用 JUnit 事务(或至少了解它在 liferay 中的工作方式)以及如何解决 BeanLocatorException(或者至少为什么会被抛出)

任何帮助将不胜感激。

最佳答案

我使用 JUnit 测试 mockito 框架并通过 PortalBeanLocatorUtil.setBeanLocator(...) 方法注入(inject)服务。我认为这显然是通过 Spring 配置来做到这一点。 Here你有完整的例子如何使用它。示例已拍摄,这样很好,因为该方法简单易懂。

package mst.unittest.example;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Before;
import org.junit.Test;

import com.liferay.portal.kernel.bean.BeanLocator;
import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalService;
import com.liferay.portal.service.UserLocalServiceUtil;

import static org.junit.Assert.*;

import static org.mockito.Mockito.*;

/**
* @author mark.stein.ms@gmail.com
*/
public class MyUserUtilTest {


private BeanLocator mockBeanLocator;

@Before
public void init() {
//create mock for BeanLocator, BeanLocator is responsible for loading of Services
mockBeanLocator = mock(BeanLocator.class);
//... and insert it in Liferay loading infrastructure (instead of Spring configuration)
PortalBeanLocatorUtil.setBeanLocator(mockBeanLocator);
}

@Test
public void testIsUserFullAge() throws PortalException, SystemException, ParseException {
//setup
SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd");
Date D2000_01_01 = format.parse("2000_01_01");
Date D1990_06_30 = format.parse("1990_06_30");
UserLocalService mockUserLocalService = mock(UserLocalService.class);
User mockUserThatIsFullAge = mock(User.class);
when(mockUserThatIsFullAge.getBirthday()).thenReturn(D1990_06_30);
User mockUserThatIsNotFullAge = mock(User.class);
when(mockUserThatIsNotFullAge.getBirthday()).thenReturn(D2000_01_01);
//overwrite getUser(...) methode so that wir get mock user-object with mocked behavior
when(mockUserLocalService.getUser(1234567)).thenReturn(mockUserThatIsFullAge);
when(mockUserLocalService.getUser(7654321)).thenReturn(mockUserThatIsNotFullAge);

//load our mock-object instead of default UserLocalService
when(mockBeanLocator.locate("com.liferay.portal.service.UserLocalService")).thenReturn(mockUserLocalService);


//run
User userFullAge = UserLocalServiceUtil.getUser(1234567);
boolean fullAge = MyUserUtil.isUserFullAge(userFullAge);

//verify
assertTrue(fullAge);

//run
User userNotFullAge = UserLocalServiceUtil.getUser(7654321);
boolean notfullAge = MyUserUtil.isUserFullAge(userNotFullAge);

//verify
assertFalse(notfullAge);
}

}

class MyUserUtil {

public static boolean isUserFullAge(User user) throws PortalException, SystemException {
Date birthday = user.getBirthday();
long years = (System.currentTimeMillis() - birthday.getTime()) / ((long)365*24*60*60*1000);
return years > 18;
}

}

你也可以在没有 mockito 框架的情况下使用这种方法,然后你必须手动创建像 MockBeanLocator 这样的模拟类。

使用 PowerMock 的方法

使用 PowerMock,您可以放弃 BeanLocator,因为 PowerMock 允许覆盖静态方法。这是 PowerMock 的相同示例:

package mst.unittest.example;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;

import static org.junit.Assert.*;

import static org.mockito.Mockito.*;

/**
* @author Mark Stein
*
*/

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserLocalServiceUtil.class)
public class LiferayAndPowerMockTest {

@Test
public void testIsUserFullAge() throws PortalException, SystemException, ParseException {
//setup
SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd");
Date D2000_01_01 = format.parse("2000_01_01");
Date D1990_06_30 = format.parse("1990_06_30");
User mockUserThatIsFullAge = mock(User.class);
when(mockUserThatIsFullAge.getBirthday()).thenReturn(D1990_06_30);
User mockUserThatIsNotFullAge = mock(User.class);
when(mockUserThatIsNotFullAge.getBirthday()).thenReturn(D2000_01_01);

//overwrite getUser(...) by UserLocalServiceUtil methode so that wir get mock user-object with mocked behavior
PowerMockito.mockStatic(UserLocalServiceUtil.class);
when(UserLocalServiceUtil.getUser(1234567)).thenReturn(mockUserThatIsFullAge);
when(UserLocalServiceUtil.getUser(7654321)).thenReturn(mockUserThatIsNotFullAge);

//run
boolean fullAge = MySecUserUtil.isUserFullAge(1234567);

//verify
assertTrue(fullAge);

//run

boolean notfullAge = MySecUserUtil.isUserFullAge(7654321);

//verify
assertFalse(notfullAge);
}

}

class MySecUserUtil {

public static boolean isUserFullAge(long userId) throws PortalException, SystemException {
User user = UserLocalServiceUtil.getUser(userId);
Date birthday = user.getBirthday();
long years = (System.currentTimeMillis() - birthday.getTime()) / ((long)365*24*60*60*1000);
return years > 18;
}

}

在这里您可以找到带有 Mockito 和 JUnit 的 PowerMock 1.4.12,包括依赖项 http://code.google.com/p/powermock/downloads/detail?name=powermock-mockito-junit-1.4.12.zip&can=2&q=

关于java - 测试自定义插件 portlet : BeanLocatorException and Transaction roll-back for services testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9701539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com