2016-01-14 76 views
2

我正在使用(EJB,JPA和JPQL)在JAVA EE中创建一个简单的Web应用程序。我想知道如何使用到的Mockito测试EJB来测试模型。我想嘲笑上下文(数据库和属性)在Java EE中的Junit测试(JPA)

我该怎么办呢?

@Mock 
private EntityManager mockedEntityManager; 
private static TendererBean tendererBean; 
private static TendererManagerBean tendererManagerBean; 
private static EJBContainer container; 
final Properties p = new Properties(); 
    p.put("jdbc/Mydatabase", "new://Resource?type=DataSource"); 
    p.put("jdbc/Mydatabase.JdbcDriver", "apache_derby_net"); 
    p.put("jdbc/Mydatabase.JdbcUrl", "jdbc:derby://localhost:1527/Mydatabase"); 
    container = EJBContainer.createEJBContainer(p); 
    final Context context = container.getContext(); 
    tendererBean = (TendererBean) context.lookup("java:global/classesTendererManagerBean"); 
+0

我看你想使用derby,这样的。而不是问“我怎么做”,说明你与你的尝试遇到的问题。 – Gimby

+0

是的,问题是我想要为我的EJB方法(如注册,更新和删除)创建测试单元,因为我应该嘲笑我的上下文,在我的应用程序中使用JSF,EJB和JPA进行持久化 –

+1

你使用CDI?依赖注入使测试/模拟变得更容易。如果你不使用它,那么我会建议先查看依赖注入。 – Kai

回答

1

应该没有必要在测试代码中绕过db属性。要记住的另一件事:一个单元测试不应该需要一个数据库连接,因为那时它比一个单元测试,它还应该嘲笑走的持久性。

EntityManager可以容易地与例如嘲笑的Mockito。此外,你可以模拟一个Query以获取测试所需的结果。

检查出Adam Bien's post on Mocking JPA EntityManager and Query如何做到这一点。

2

亚历克斯是正确的,你不应该需要在单元测试中的数据库连接(除非你尝试创建一个集成测试)你可以尝试像这样嘲笑他们。代码可以是凌乱的,希望它有助于

public class ChargeServiceTest { 

@InjectMocks 
private ChargeService chargeService; 

@Mock 
private EntityManager entityManager; 

@Mock 
private Query query; 
@Mock 
private Biller biller; 
@Mock 
private Client client; 

private String expectedSqlQuery1 = "Select count(c) from ClientContractCharge c where c.clientContract.biller =?1 and c.recurringInvoice = true and c.clientContract.client = ?2 and (c.dateCreated >= ?3 or c.dateLastUpdated >= ?3) order by c.dateCreated ASC"; 

@Before 
public void before() { 
    chargeService = new ChargeService(); 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void listCountTest1() { 
    when(entityManager.createQuery(expectedSqlQuery1)).thenReturn(query); 
    when(query.getSingleResult()).thenReturn((long) 10); 
    Long count = chargeService.listCount(biller, client); 
    verify(query).setParameter(1, biller); 
    assertEquals(count, Long.valueOf(10)); 
} 
} 

服务类

@Stateless 
@LocalBean public class ChargeService { 
public long listCount(Biller biller, Client client) { 

    StringBuilder s = new StringBuilder(); 
    s.append("Select count(c) from ClientContractCharge c where c.clientContract.biller =?1 and c.recurringInvoice = true "); 
    if (client != null) { 
     s.append("and c.clientContract.client = ?2 "); 
    } 
    s.append(" order by c.dateCreated ASC"); 
    Query q = em.createQuery(s.toString()); 
    q.setParameter(1, biller); 
    if (client != null) { 
     q.setParameter(2, client); 
    } 

    return (long) (Long) q.getSingleResult(); 
}