使用Mockito编写ATG测试用例



有人知道用Mockito为ATG编写单元测试用例吗?我在瞪大眼睛的时候偶然发现了以下讨论-用于ATG开发和在NPE 测试结果中使用PowerMock获得ATG核

但在使用Mockito设置Nucleus和其他依赖项(DAS、DPS、DSS等)以及液滴的样本测试类方面需要帮助。

我们正在使用ATG Dust,在那里我们必须设置所有的依赖项。我想知道我们是否可以用Mockito完全取代ATG Dust。以下是我们如何编写测试用例的示例-

  1. 用于设置Nucleus的基类-
package com.ebiz.market.support;
import java.io.File;
import java.util.Arrays;
import atg.nucleus.NucleusTestUtils;
import atg.test.AtgDustCase;
import atg.test.util.FileUtil;
public class BaseTestCase extends AtgDustCase {
public atg.nucleus.Nucleus mNucleus = null;
private final String ATGHOME="C://ATG/ATG9.4//home";
private final String ATGHOMEPROPERTY = "atg.dynamo.home";
protected void setUp() throws Exception {
super.setUp();
String dynamoHome = System.getProperty(ATGHOMEPROPERTY);
if(dynamoHome == null)
System.setProperty(ATGHOMEPROPERTY, ATGHOME);
File configpath = NucleusTestUtils.getConfigpath(this.getClass(), this.getClass().getName(), true);
FileUtil.copyDirectory("src/test/resources/config/test/", configpath.getAbsolutePath(), Arrays.asList(new String [] {".svn"}));
copyConfigurationFiles(new String[]{"config"}, configpath.getAbsolutePath(), ".svn");
}
public File getConfigPath() {
  return NucleusTestUtils.getConfigpath(this.getClass(), this.getClass().getName(), true);
}
}
  1. 通过扩展基类编写测试用例-
public class BizDropletTest extends BaseTestCase {
private BizDroplet bizDroplet;
@Before
public void setUp() throws Exception {
super.setUp();
mNucleus = NucleusTestUtils.startNucleusWithModules(new String[] { "DSS", "DPS", "DAFEAR" }, this.getClass(),
this.getClass().getName(), "com/ebiz/market/support/droplet/BizDroplet");
autoSuggestDroplet = (AutoSuggestDroplet) mNucleus.resolveName("com/ebiz/market/support/droplet/BizDroplet");
try {
bizDroplet.doStartService();
} catch (ServiceException e) {
fail(e.getMessage());
}
}
/**
Other methods
*/
}

那么,Mockito是如何处理这些问题的呢?同样,对我来说,目标是用Mockito完全取代ATG Dust,因为由于巨大的依赖性,ATG Duster在运行测试时需要花费大量时间。

谢谢。

使用Mockito,您不会设置Nucleus或其他依赖项(除非您需要)。您只需模拟需要使用的对象。

考虑一个简单的类ProductUrlDroplet,它从存储库中检索产品,然后基于此输出url。service方法看起来像这样:

public void service(DynamoHttpServletRequest pRequest, DynamoHttpServletResponse pResponse) throws ServletException, IOException {
    Object product = pRequest.getObjectParameter(PRODUCT_ID);
    RepositoryItem productItem = (RepositoryItem) product;
    String generatedUrl = generateProductUrl(pRequest, productItem.getRepositoryId());
    pRequest.setParameter(PRODUCT_URL_ID, generatedUrl);
    pRequest.serviceParameter(OPARAM_OUTPUT, pRequest, pResponse);
}
private String generateProductUrl(DynamoHttpServletRequest request, String productId) {
    HttpServletRequest originatingRequest = (HttpServletRequest) request.resolveName("/OriginatingRequest");
    String contextroot = originatingRequest.getContextPath();
    return contextroot + "/browse/product.jsp?productId=" + productId;
}

一个简单的测试类是:

public class ProductUrlDropletTest {
@InjectMocks private ProductUrlDroplet testObj;
@Mock private DynamoHttpServletRequest requestMock;
@Mock private DynamoHttpServletResponse responseMock;
@Mock private RepositoryItem productRepositoryItemMock;
@BeforeMethod(groups = { "unit" })
public void setup() throws Exception {
    testObj = new ProductUrlDroplet();
    MockitoAnnotations.initMocks(this);
    Mockito.when(productRepositoryItemMock.getRepositoryId()).thenReturn("50302372");
}
@Test(groups = { "unit" })
public void testProductURL() throws Exception {
    Mockito.when(requestMock.getObjectParameter(ProductUrlDroplet.PRODUCT_ID)).thenReturn(productRepositoryItemMock);
    testObj.service(requestMock, responseMock);
    ArgumentCaptor<String> argumentProductURL = ArgumentCaptor.forClass(String.class);
    Mockito.verify(requestMock).setParameter(Matchers.eq(ProductUrlDroplet.PRODUCT_URL_ID), argumentProductURL.capture());
    Assert.assertTrue(argumentProductURL.getValue().equals("/browse/product.jsp?productId=50302372"));
}
}   

关键组件是您需要初始化要测试的类(testObj)。然后,您只需为要使用的对象的每个输入参数构造响应(在这种情况下,productRepositoryItemMock表示RepositoryItemproductRepositoryItemMock.getRepositoryId()返回一个String,您可以稍后对其进行测试)。

您还会注意到,此测试只验证service方法,而不验证单个方法。如何做到这一点取决于您,但一般来说,我一直专注于在表单处理程序和液滴中测试我的servicehandleXXX方法。

测试XXXManager、XXXUtil和XXXService类都将有自己的测试,并且应该被"模拟"到液滴和表单处理程序中。对于这些,我会为每个方法编写测试。

只有当您需要模拟static方法和类时,PowerMockito才会真正出现,并且文档足以解释这一点。

相关内容

  • 没有找到相关文章

最新更新