如何在Salesforce中工作单位测试?
-
09-10-2019 - |
题
我已经写了关于Salesforce的代码,为了发布单位测试,必须至少涵盖 75%.
我面对的是 classOne
从 classTwo
也必须覆盖 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中创建模拟对象? 我还不知道如何..
乳房
我重新编写了代码并在上面进行了更新,这次确定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;
}
}
}