我已经写了关于Salesforce的代码,为了发布单位测试,必须至少涵盖 75%.

我面对的是 classOneclassTwo 也必须覆盖 classTwo的单位测试 在ClassOne中 即使在 classTwo 文件已经。

文件myclasstwo

 public with sharing class ClassTwo {

    public String method1() {
        return 'one';
    }

    public String method2() {
        return 'two';
    }

    public static testMethod void testMethod1() {

        ClassTwo two = new ClassTwo();
        String out = two.method1();
        system.assertEquals(out, 'one'); //valid    
    }

    public static testMethod void testMethod2() {
        ClassTwo two = new ClassTwo();
        String out = two.method2();
        system.assertEquals(out, 'two'); // valid
    }

}

归档myclassone

 public with sharing class ClassOne {

    public String callClassTwo() {
        ClassTwo foo = new ClassTwo();
        String something = foo.method1();

        return something;
    }

    public static testMethod void testCallClassTwo() {
        ClassOne one = new ClassOne();
        String out = one.callClassTwo();

        system.assertEquals(out, 'one');
    }
}

测试myclassone的结果不会返回100%的测试覆盖范围,因为它说我没有覆盖myclassone文件内部的myClasstwo Method2()部分。

但是我已经在MyClasstwo文件中为MyClasstwo编写了单元测试,如您所见。

那么,这是否意味着我必须将单位测试复制并粘贴到myclasstwo文件中?

这样做给了我100%的覆盖范围,但这似乎真的很烦人和奇怪。在classa和classB中都有相同的测试....?我做错了还是这样?

说了, 是否可以在Salesforce中创建模拟对象? 我还不知道如何..

http://sites.force.com/answers/ideaview?c=09a3000000000d9xt&id=0873000000000007M3FAAA&reterurnurl =/idealist%3FC%3D09A3D09A30000000000000D9XTM26CATEGORYXPATEMORTIM2BPIM222222BUTM 2009AXTM2222BUTIM 2000D9AXTPIM2BICATM212BICATM212BICATM21BICATPIL 200;

乳房

我重新编写了代码并在上面进行了更新,这次确定ClassOne测试也不会返回100%,即使它没有调用Classtwo Method2()

有帮助吗?

解决方案

关于Java模拟库的评论在Salesforce世界中并不有用;)在我的项目中,我们通常旨在在测试方法中制作自己的测试数据,调用实际功能,检查结果...以及Salesforce方面的整个测试框架是负责交易回滚(因此,无论测试失败还是通过,都不会将测试数据保存到DB。

反正...

masato,您的课程不编译(课堂范围之外的方法, public String hello() 没有返回的任何字符串)...修复后,我只是右键单击myclassa-> force.com->运行测试并获得完整的代码覆盖范围而没有任何问题,因此您的问题必须位于其他地方...

它的外观: http://dl.dropbox.com/u/709568/stackoverflow/masato_code_coverage.png

我试图想到可能出了什么问题...您确定所有类都编译并保存在服务器端吗?您是否将测试方法与功能或单独的类别相同的类中进行 MyClassATest)。如果这是一个单独的类 - 您单击了哪个文件“运行测试”?最后但并非最不重要的一点 - 如果您在从沙箱到生产的部署期间面临此问题,请确保您选择了在部署向导中所需的所有类?

其他提示

如果您真的想“单元”测试,则应测试B类的行为和A类的行为,并嘲笑B类方法的调用。

这是模拟恋人和其他人之间的艰难对话(马丁·福勒(Martin Fowler)我认为不是“嘲笑”)。

反正。您应该停止考虑约100%的覆盖范围。您应该考虑:

  • 我为什么要测试?

  • 我如何测试?

在这里,我一定会参加2个测试:

  • B类在B类测试文件中进行的一个测试,以确保B类实现了B类,并具有所有副作用,侧值等。

  • A级嘲笑B类的一个测试

什么是模拟?

保持非常简单:一个模拟是您的测试中的一部分代码,它会说:当调用B类方法时,请始终返回此值:“ +++”。

通过这样做,您允许自己拥有可维护和可调节的测试套件。

在Java,我爱Mockito: http://mockito.org/

尽管我的一位同事是Easymock的首席维护者: http://easymock.org/

希望这可以帮助。问我是否需要进一步的帮助。

编辑一些示例

与Java和Mockito:

public class aUTest {

    protected A a;

    @Mock protected B b;

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        a = new A();
        ReflectionTestUtils.setField(a, "b", b);
    }

        @Test
    public void test_A_method_should_not_throw_exception()
            when(b. execute()).thenReturn(true); //just an example of a return value from b. execute()
            Boolean result = a.testHello();

        // Assert
        Assert.assertEquals(true, result);
    }

我为所有模拟对象创建了一个名为TestHelper的Apex类。我使用常数(静态最终)来实现我可能需要其他地方的值和对象的公共静态字段。工作很棒,由于不使用任何方法,因此不需要测试覆盖范围。

public without sharing class TestHelper {
public static final string testPRODUCTNAME = 'test Product Name';
public static final string testCOMPANYID = '2508'; 

public static Account testAccount {
    get{
        Account tAccount = new Account(
            Name = 'Test Account',
            BillingStreet = '123 Main St',
            BillingCity = 'Dallas',
            BillingState = 'TX',
            BillingPostalCode = '75234',
            Website = 'http://www.google.com',
            Phone = '222 345 4567',                
            Subscription_Start_Date__c = system.today(),
            Subscription_End_Date__c = system.today().addDays(30),
            Number_Of_Seats__c = 1,
            companyId__c = testCOMPANYID,
            ZProduct_Name__c = testPRODUCTNAME);      
        insert tAccount;
        return tAccount; 
    }
}

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top