Use this file to discover all available pages before exploring further.
iDempiere has a comprehensive test suite to ensure code quality and prevent regressions. This guide covers the testing framework and how to write and run tests.
package org.idempiere.test.model;import static org.junit.jupiter.api.Assertions.*;import org.idempiere.test.AbstractTestCase;import org.junit.jupiter.api.Test;public class MyTest extends AbstractTestCase { @Test public void testSomething() { // Your test code here }}
The AbstractTestCase provides a pre-configured context:
import org.compiere.util.Env;import org.idempiere.test.DictionaryIDs;@Testpublic void testWithContext() { // Access to Garden World context int clientId = GARDEN_WORLD_CLIENT; // From AbstractTestCase int orgId = GARDEN_WORLD_HQ_ORG; // Use DictionaryIDs for reference data int productId = DictionaryIDs.M_Product.AZALEA_BUSH.id; int partnerId = DictionaryIDs.C_BPartner.JOE_BLOCK.id; // Transaction name from test case String trxName = getTrxName(); // Your test logic}
package org.idempiere.test.model;import org.compiere.model.MOrder;import org.compiere.model.MBPartner;import org.idempiere.test.AbstractTestCase;import org.idempiere.test.DictionaryIDs;import static org.junit.jupiter.api.Assertions.*;import org.junit.jupiter.api.Test;public class SalesOrderTest extends AbstractTestCase { @Test public void testCreateOrder() { MOrder order = new MOrder(Env.getCtx(), 0, getTrxName()); order.setBPartner(MBPartner.get(Env.getCtx(), DictionaryIDs.C_BPartner.JOE_BLOCK.id)); order.setC_DocTypeTarget_ID(MOrder.DocSubTypeSO_Standard); assertTrue(order.save(), "Order should be saved"); assertNotNull(order.getDocumentNo(), "Document number should be generated"); }}
Examples in codebase:
SalesOrderTest.java - Sales order functionality
PurchaseOrderTest.java - Purchase order functionality
package org.idempiere.test.process;import org.compiere.process.ProcessInfo;import org.idempiere.test.AbstractTestCase;import org.junit.jupiter.api.Test;public class MyProcessTest extends AbstractTestCase { @Test public void testProcess() { ProcessInfo pi = new ProcessInfo("Test", processId); // Configure and run process // Assert results }}
# Run all testsmvn test# Run specific test classmvn test -Dtest=SalesOrderTest# Run specific test methodmvn test -Dtest=SalesOrderTest#testCreateOrder# Skip testsmvn clean install -DskipTests
@Test/** * Test that order validation fails when multiple * date promised values exist with complete order delivery rule. * https://idempiere.atlassian.net/browse/IDEMPIERE-235 */public void testDatePromisedValidation() { // Test implementation}
public class MyTest extends AbstractTestCase { @Test public void testSomething() { // Get transaction name from test case String trxName = getTrxName(); // Use in database operations MOrder order = new MOrder(Env.getCtx(), 0, trxName); // Transaction automatically rolls back after test }}
@Testpublic void testDocumentCompletion() { MOrder order = createTestOrder(); // Process document order.processIt(DocAction.ACTION_Complete); order.saveEx(); // Verify status assertEquals(DocAction.STATUS_Completed, order.getDocStatus()); // Verify accounting was created String whereClause = "AD_Table_ID=? AND Record_ID=?"; int count = new Query(Env.getCtx(), MFactAcct.Table_Name, whereClause, getTrxName()) .setParameters(MOrder.Table_ID, order.getC_Order_ID()) .count(); assertTrue(count > 0, "Accounting entries should be created");}
@Testpublic void testValidation() { MOrder order = new MOrder(Env.getCtx(), 0, getTrxName()); // Missing required field should fail validation assertFalse(order.save(), "Save should fail without partner"); // With required field should succeed order.setBPartner(MBPartner.get(Env.getCtx(), DictionaryIDs.C_BPartner.JOE_BLOCK.id)); assertTrue(order.save(), "Save should succeed with partner");}