remove spring framework from demos

This commit is contained in:
金戟 2020-11-22 00:10:12 +08:00
parent b8b4844c38
commit 47115b22af
30 changed files with 272 additions and 371 deletions

View File

@ -1,60 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <groupId>com.alibaba.testable</groupId>
<groupId>org.springframework.boot</groupId> <artifactId>java-demo</artifactId>
<artifactId>spring-boot-starter-parent</artifactId> <version>1.0.0-SNAPSHOT</version>
<version>2.3.4.RELEASE</version> <name>java-demo</name>
<relativePath/> <!-- lookup parent from repository --> <description>Demo project for TestableMock</description>
</parent>
<groupId>com.alibaba.testable</groupId>
<artifactId>java-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>java-demo</name>
<description>Demo project for Spring Boot</description>
<properties> <properties>
<java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source>
<testable.version>0.3.1-SNAPSHOT</testable.version> <maven.compiler.target>1.8</maven.compiler.target>
</properties> <testable.version>0.3.1-SNAPSHOT</testable.version>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>com.alibaba.testable</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>testable-processor</artifactId>
</dependency> <version>${testable.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<dependency> <build>
<groupId>com.alibaba.testable</groupId> <plugins>
<artifactId>testable-processor</artifactId> <plugin>
<version>${testable.version}</version> <groupId>org.apache.maven.plugins</groupId>
<scope>provided</scope> <artifactId>maven-surefire-plugin</artifactId>
</dependency> <version>3.0.0-M5</version>
</plugin>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- <plugin>--> <!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>--> <!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-surefire-plugin</artifactId>--> <!-- <artifactId>maven-surefire-plugin</artifactId>-->
@ -62,44 +43,44 @@
<!-- <argLine>@{argLine} -javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar</argLine>--> <!-- <argLine>@{argLine} -javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar</argLine>-->
<!-- </configuration>--> <!-- </configuration>-->
<!-- </plugin>--> <!-- </plugin>-->
<plugin> <plugin>
<groupId>com.alibaba.testable</groupId> <groupId>com.alibaba.testable</groupId>
<artifactId>testable-maven-plugin</artifactId> <artifactId>testable-maven-plugin</artifactId>
<version>${testable.version}</version> <version>${testable.version}</version>
<executions> <executions>
<execution> <execution>
<id>prepare</id> <id>prepare</id>
<goals> <goals>
<goal>prepare</goal> <goal>prepare</goal>
</goals> </goals>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId> <artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version> <version>0.8.6</version>
<executions> <executions>
<execution> <execution>
<id>prepare-agent</id> <id>prepare-agent</id>
<goals> <goals>
<goal>prepare-agent</goal> <goal>prepare-agent</goal>
</goals> </goals>
</execution> </execution>
<execution> <execution>
<id>report</id> <id>report</id>
<phase>prepare-package</phase> <phase>prepare-package</phase>
<goals> <goals>
<goal>report</goal> <goal>report</goal>
</goals> </goals>
<configuration> <configuration>
<dataFile>target/jacoco.exec</dataFile> <dataFile>target/jacoco.exec</dataFile>
<outputDirectory>target/jacoco-ut</outputDirectory> <outputDirectory>target/jacoco-ut</outputDirectory>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@ -1,12 +0,0 @@
package com.alibaba.testable.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

View File

@ -1,12 +1,13 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.demo.model.BlackBox; import com.alibaba.testable.demo.model.BlackBox;
import com.alibaba.testable.demo.model.Box; import com.alibaba.testable.demo.model.Box;
import com.alibaba.testable.demo.model.Color; import com.alibaba.testable.demo.model.Color;
import org.springframework.stereotype.Service;
@Service /**
public class DemoInheritService { * @author flin
*/
public class DemoInherit {
/** /**
* call method overridden by sub class via parent class variable * call method overridden by sub class via parent class variable

View File

@ -1,8 +1,7 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.demo.model.BlackBox; import com.alibaba.testable.demo.model.BlackBox;
import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -12,8 +11,7 @@ import java.util.List;
/** /**
* @author flin * @author flin
*/ */
@Service public class DemoMatcher {
public class DemoMatcherService {
/** /**
* Method to be mocked * Method to be mocked

View File

@ -1,14 +1,11 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.demo.model.BlackBox; import com.alibaba.testable.demo.model.BlackBox;
import com.alibaba.testable.demo.model.Box;
import org.springframework.stereotype.Service;
import sun.net.www.http.HttpClient; import sun.net.www.http.HttpClient;
import java.net.URL; import java.net.URL;
@Service public class DemoMock {
public class DemoMockService {
/** /**
* method with new operation * method with new operation

View File

@ -1,9 +1,9 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import org.springframework.stereotype.Service; /**
* @author flin
@Service */
public class DemoPrivateAccessService { public class DemoPrivateAccess {
private int count; private int count;

View File

@ -1,13 +0,0 @@
package com.alibaba.testable.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.core.annotation.TestableMock; import com.alibaba.testable.core.annotation.TestableMock;
import com.alibaba.testable.demo.model.BlackBox; import com.alibaba.testable.demo.model.BlackBox;
@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
import static com.alibaba.testable.core.matcher.InvokeVerifier.verify; import static com.alibaba.testable.core.matcher.InvokeVerifier.verify;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
class DemoInheritServiceTest { class DemoInheritTest {
@TestableMock(targetMethod = "put") @TestableMock(targetMethod = "put")
private void put_into_box(Box self, String something) { private void put_into_box(Box self, String something) {
@ -41,46 +41,46 @@ class DemoInheritServiceTest {
return "color_from_blackbox"; return "color_from_blackbox";
} }
private DemoInheritService inheritService = new DemoInheritService(); private DemoInherit demoInherit = new DemoInherit();
@Test @Test
void should_able_to_mock_call_sub_object_method_by_parent_object() throws Exception { void should_able_to_mock_call_sub_object_method_by_parent_object() throws Exception {
BlackBox box = (BlackBox)inheritService.putIntoBox(); BlackBox box = (BlackBox)demoInherit.putIntoBox();
verify("put_into_box").withTimes(1); verify("put_into_box").withTimes(1);
assertEquals("put_data_into_box", box.get()); assertEquals("put_data_into_box", box.get());
} }
@Test @Test
void should_able_to_mock_call_sub_object_method_by_sub_object() throws Exception { void should_able_to_mock_call_sub_object_method_by_sub_object() throws Exception {
BlackBox box = inheritService.putIntoBlackBox(); BlackBox box = demoInherit.putIntoBlackBox();
verify("put_into_blackbox").withTimes(1); verify("put_into_blackbox").withTimes(1);
assertEquals("put_data_into_blackbox", box.get()); assertEquals("put_data_into_blackbox", box.get());
} }
@Test @Test
void should_able_to_mock_call_parent_object_method_by_parent_object() throws Exception { void should_able_to_mock_call_parent_object_method_by_parent_object() throws Exception {
String content = inheritService.getFromBox(); String content = demoInherit.getFromBox();
verify("get_from_box").withTimes(1); verify("get_from_box").withTimes(1);
assertEquals("get_from_box", content); assertEquals("get_from_box", content);
} }
@Test @Test
void should_able_to_mock_call_parent_object_method_by_sub_object() throws Exception { void should_able_to_mock_call_parent_object_method_by_sub_object() throws Exception {
String content = inheritService.getFromBlackBox(); String content = demoInherit.getFromBlackBox();
verify("get_from_blackbox").withTimes(1); verify("get_from_blackbox").withTimes(1);
assertEquals("get_from_blackbox", content); assertEquals("get_from_blackbox", content);
} }
@Test @Test
void should_able_to_mock_call_interface_method_by_interface_object() throws Exception { void should_able_to_mock_call_interface_method_by_interface_object() throws Exception {
String color = inheritService.getColorViaColor(); String color = demoInherit.getColorViaColor();
verify("get_color_from_color").withTimes(1); verify("get_color_from_color").withTimes(1);
assertEquals("color_from_color", color); assertEquals("color_from_color", color);
} }
@Test @Test
void should_able_to_mock_call_interface_method_by_sub_class_object() throws Exception { void should_able_to_mock_call_interface_method_by_sub_class_object() throws Exception {
String color = inheritService.getColorViaBox(); String color = demoInherit.getColorViaBox();
verify("get_color_from_blackbox").withTimes(1); verify("get_color_from_blackbox").withTimes(1);
assertEquals("color_from_blackbox", color); assertEquals("color_from_blackbox", color);
} }

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.core.annotation.TestableMock; import com.alibaba.testable.core.annotation.TestableMock;
import com.alibaba.testable.core.error.VerifyFailedError; import com.alibaba.testable.core.error.VerifyFailedError;
@ -9,30 +9,30 @@ import static com.alibaba.testable.core.matcher.InvokeMatcher.*;
import static com.alibaba.testable.core.matcher.InvokeVerifier.verify; import static com.alibaba.testable.core.matcher.InvokeVerifier.verify;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
class DemoMatcherServiceTest { class DemoMatcherTest {
private DemoMatcherService demo = new DemoMatcherService(); private DemoMatcher demoMatcher = new DemoMatcher();
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private void methodWithoutArgument(DemoMatcherService self) {} private void methodWithoutArgument(DemoMatcher self) {}
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private void methodWithArguments(DemoMatcherService self, Object a1, Object a2) {} private void methodWithArguments(DemoMatcher self, Object a1, Object a2) {}
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private void methodWithArrayArgument(DemoMatcherService self, Object[] a) {} private void methodWithArrayArgument(DemoMatcher self, Object[] a) {}
@Test @Test
void should_match_no_argument() { void should_match_no_argument() {
demo.callMethodWithoutArgument(); demoMatcher.callMethodWithoutArgument();
verify("methodWithoutArgument").withTimes(1); verify("methodWithoutArgument").withTimes(1);
demo.callMethodWithoutArgument(); demoMatcher.callMethodWithoutArgument();
verify("methodWithoutArgument").withTimes(2); verify("methodWithoutArgument").withTimes(2);
} }
@Test @Test
void should_match_number_arguments() { void should_match_number_arguments() {
demo.callMethodWithNumberArguments(); demoMatcher.callMethodWithNumberArguments();
verify("methodWithArguments").without(anyString(), 2); verify("methodWithArguments").without(anyString(), 2);
verify("methodWithArguments").withInOrder(anyInt(), 2); verify("methodWithArguments").withInOrder(anyInt(), 2);
verify("methodWithArguments").withInOrder(anyLong(), anyNumber()); verify("methodWithArguments").withInOrder(anyLong(), anyNumber());
@ -45,7 +45,7 @@ class DemoMatcherServiceTest {
@Test @Test
void should_match_string_arguments() { void should_match_string_arguments() {
demo.callMethodWithStringArgument(); demoMatcher.callMethodWithStringArgument();
verify("methodWithArguments").with(startsWith("he"), endsWith("ld")); verify("methodWithArguments").with(startsWith("he"), endsWith("ld"));
verify("methodWithArguments").with(contains("stab"), matches("m.[cd]k")); verify("methodWithArguments").with(contains("stab"), matches("m.[cd]k"));
verify("methodWithArrayArgument").with(anyArrayOf(String.class)); verify("methodWithArrayArgument").with(anyArrayOf(String.class));
@ -53,7 +53,7 @@ class DemoMatcherServiceTest {
@Test @Test
void should_match_object_arguments() { void should_match_object_arguments() {
demo.callMethodWithObjectArgument(); demoMatcher.callMethodWithObjectArgument();
verify("methodWithArguments").withInOrder(any(BlackBox.class), any(BlackBox.class)); verify("methodWithArguments").withInOrder(any(BlackBox.class), any(BlackBox.class));
verify("methodWithArguments").withInOrder(nullable(BlackBox.class), nullable(BlackBox.class)); verify("methodWithArguments").withInOrder(nullable(BlackBox.class), nullable(BlackBox.class));
verify("methodWithArguments").withInOrder(isNull(), notNull()); verify("methodWithArguments").withInOrder(isNull(), notNull());
@ -61,10 +61,10 @@ class DemoMatcherServiceTest {
@Test @Test
void should_match_with_times() { void should_match_with_times() {
demo.callMethodWithNumberArguments(); demoMatcher.callMethodWithNumberArguments();
verify("methodWithArguments").with(anyNumber(), any()).times(3); verify("methodWithArguments").with(anyNumber(), any()).times(3);
demo.callMethodWithNumberArguments(); demoMatcher.callMethodWithNumberArguments();
boolean gotError = false; boolean gotError = false;
try { try {
verify("methodWithArguments").with(anyNumber(), any()).times(4); verify("methodWithArguments").with(anyNumber(), any()).times(4);

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service; package com.alibaba.testable.demo;
import com.alibaba.testable.core.annotation.TestableMock; import com.alibaba.testable.core.annotation.TestableMock;
import com.alibaba.testable.demo.model.BlackBox; import com.alibaba.testable.demo.model.BlackBox;
@ -10,7 +10,7 @@ import static com.alibaba.testable.core.matcher.InvokeVerifier.verify;
import static com.alibaba.testable.core.tool.TestableTool.*; import static com.alibaba.testable.core.tool.TestableTool.*;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
class DemoMockServiceTest { class DemoMockTest {
@TestableMock(targetMethod = CONSTRUCTOR) @TestableMock(targetMethod = CONSTRUCTOR)
private BlackBox createBlackBox(String text) { private BlackBox createBlackBox(String text) {
@ -18,7 +18,7 @@ class DemoMockServiceTest {
} }
@TestableMock @TestableMock
private String innerFunc(DemoMockService self, String text) { private String innerFunc(DemoMock self, String text) {
return "mock_" + text; return "mock_" + text;
} }
@ -43,7 +43,7 @@ class DemoMockServiceTest {
} }
@TestableMock @TestableMock
private String callFromDifferentMethod(DemoMockService self) { private String callFromDifferentMethod(DemoMock self) {
if (TEST_CASE.equals("should_able_to_get_test_case_name")) { if (TEST_CASE.equals("should_able_to_get_test_case_name")) {
return "mock_special"; return "mock_special";
} }
@ -53,23 +53,23 @@ class DemoMockServiceTest {
} }
} }
private DemoMockService demoService = new DemoMockService(); private DemoMock demoMock = new DemoMock();
@Test @Test
void should_able_to_mock_new_object() throws Exception { void should_able_to_mock_new_object() throws Exception {
assertEquals("mock_something", demoService.newFunc()); assertEquals("mock_something", demoMock.newFunc());
verify("createBlackBox").with("something"); verify("createBlackBox").with("something");
} }
@Test @Test
void should_able_to_mock_member_method() throws Exception { void should_able_to_mock_member_method() throws Exception {
assertEquals("{ \"res\": \"mock_hello\"}", demoService.outerFunc("hello")); assertEquals("{ \"res\": \"mock_hello\"}", demoMock.outerFunc("hello"));
verify("innerFunc").with("hello"); verify("innerFunc").with("hello");
} }
@Test @Test
void should_able_to_mock_common_method() throws Exception { void should_able_to_mock_common_method() throws Exception {
assertEquals("trim_string__sub_string__false", demoService.commonFunc()); assertEquals("trim_string__sub_string__false", demoMock.commonFunc());
verify("trim").withTimes(1); verify("trim").withTimes(1);
verify("sub").withTimes(1); verify("sub").withTimes(1);
verify("startsWith").withTimes(1); verify("startsWith").withTimes(1);
@ -77,26 +77,26 @@ class DemoMockServiceTest {
@Test @Test
void should_able_to_mock_static_method() throws Exception { void should_able_to_mock_static_method() throws Exception {
assertEquals("not_secret_box", demoService.getBox().get()); assertEquals("not_secret_box", demoMock.getBox().get());
verify("secretBox").withTimes(1); verify("secretBox").withTimes(1);
} }
@Test @Test
void should_able_to_get_source_method_name() throws Exception { void should_able_to_get_source_method_name() throws Exception {
// synchronous // synchronous
assertEquals("mock_one_mock_others", demoService.callerOne() + "_" + demoService.callerTwo()); assertEquals("mock_one_mock_others", demoMock.callerOne() + "_" + demoMock.callerTwo());
// asynchronous // asynchronous
assertEquals("mock_one_mock_others", assertEquals("mock_one_mock_others",
Executors.newSingleThreadExecutor().submit(() -> demoService.callerOne() + "_" + demoService.callerTwo()).get()); Executors.newSingleThreadExecutor().submit(() -> demoMock.callerOne() + "_" + demoMock.callerTwo()).get());
verify("callFromDifferentMethod").withTimes(4); verify("callFromDifferentMethod").withTimes(4);
} }
@Test @Test
void should_able_to_get_test_case_name() throws Exception { void should_able_to_get_test_case_name() throws Exception {
// synchronous // synchronous
assertEquals("mock_special", demoService.callerOne()); assertEquals("mock_special", demoMock.callerOne());
// asynchronous // asynchronous
assertEquals("mock_special", Executors.newSingleThreadExecutor().submit(() -> demoService.callerOne()).get()); assertEquals("mock_special", Executors.newSingleThreadExecutor().submit(() -> demoMock.callerOne()).get());
verify("callFromDifferentMethod").withTimes(2); verify("callFromDifferentMethod").withTimes(2);
} }

View File

@ -0,0 +1,37 @@
package com.alibaba.testable.demo;
import com.alibaba.testable.core.accessor.PrivateAccessor;
import com.alibaba.testable.processor.annotation.EnablePrivateAccess;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@EnablePrivateAccess
class DemoPrivateAccessTest {
private DemoPrivateAccess demoPrivateAccess = new DemoPrivateAccess();
@Test
void should_able_to_access_private_method() throws Exception {
assertEquals("hello - 1", demoPrivateAccess.privateFunc("hello", 1));
assertEquals("hello - 1", PrivateAccessor.invoke(demoPrivateAccess, "privateFunc", "hello", 1));
}
@Test
void should_able_to_access_private_field() throws Exception {
demoPrivateAccess.count = 2;
assertEquals("4", demoPrivateAccess.privateFieldAccessFunc());
assertEquals(new Integer(4), demoPrivateAccess.count);
PrivateAccessor.set(demoPrivateAccess, "count", 3);
assertEquals("5", demoPrivateAccess.privateFieldAccessFunc());
assertEquals(new Integer(5), PrivateAccessor.get(demoPrivateAccess, "count"));
}
@Test
void should_able_to_update_final_field() throws Exception {
demoPrivateAccess.pi = 4.13;
assertEquals(4.13, demoPrivateAccess.pi);
}
}

View File

@ -1,37 +0,0 @@
package com.alibaba.testable.demo.service;
import com.alibaba.testable.core.accessor.PrivateAccessor;
import com.alibaba.testable.processor.annotation.EnablePrivateAccess;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@EnablePrivateAccess
class DemoPrivateAccessServiceTest {
private DemoPrivateAccessService demoService = new DemoPrivateAccessService();
@Test
void should_able_to_access_private_method() throws Exception {
assertEquals("hello - 1", demoService.privateFunc("hello", 1));
assertEquals("hello - 1", PrivateAccessor.invoke(demoService, "privateFunc", "hello", 1));
}
@Test
void should_able_to_access_private_field() throws Exception {
demoService.count = 2;
assertEquals("4", demoService.privateFieldAccessFunc());
assertEquals(new Integer(4), demoService.count);
PrivateAccessor.set(demoService, "count", 3);
assertEquals("5", demoService.privateFieldAccessFunc());
assertEquals(new Integer(5), PrivateAccessor.get(demoService, "count"));
}
@Test
void should_able_to_update_final_field() throws Exception {
demoService.pi = 4.13;
assertEquals(4.13, demoService.pi);
}
}

View File

@ -2,40 +2,30 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.alibaba.testable</groupId> <groupId>com.alibaba.testable</groupId>
<artifactId>kotlin-demo</artifactId> <artifactId>kotlin-demo</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
<name>kotlin-demo</name> <name>kotlin-demo</name>
<description>Demo project for Spring Boot</description> <description>Demo project for TestableMock</description>
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<kotlin.version>1.3.72</kotlin.version> <kotlin.version>1.3.72</kotlin.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<testable.version>0.3.1-SNAPSHOT</testable.version> <testable.version>0.3.1-SNAPSHOT</testable.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.jetbrains.kotlin</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId> <artifactId>kotlin-reflect</artifactId>
<version>${kotlin.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jetbrains.kotlin</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId> <artifactId>kotlin-stdlib-jdk8</artifactId>
</dependency> <version>${kotlin.version}</version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
@ -44,27 +34,22 @@
<version>${testable.version}</version> <version>${testable.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope> <scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory> <sourceDirectory>src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin> </plugin>
<!-- <plugin>--> <!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>--> <!-- <groupId>org.apache.maven.plugins</groupId>-->
@ -86,25 +71,6 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
</args>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId> <artifactId>jacoco-maven-plugin</artifactId>
@ -129,6 +95,27 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@ -1,11 +0,0 @@
package com.alibaba.testable.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}

View File

@ -1,12 +1,10 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.demo.model.BlackBox import com.alibaba.testable.demo.model.BlackBox
import com.alibaba.testable.demo.model.Box import com.alibaba.testable.demo.model.Box
import com.alibaba.testable.demo.model.Color import com.alibaba.testable.demo.model.Color
import org.springframework.stereotype.Service
@Service class DemoInherit {
class DemoInheritService {
/** /**
* call method overridden by sub class via parent class variable * call method overridden by sub class via parent class variable

View File

@ -1,14 +1,12 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.demo.model.BlackBox import com.alibaba.testable.demo.model.BlackBox
import org.springframework.stereotype.Service
import java.util.* import java.util.*
/** /**
* @author flin * @author flin
*/ */
@Service class DemoMatcher {
class DemoMatcherService {
/** /**
* Method to be mocked * Method to be mocked
*/ */

View File

@ -1,15 +1,11 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.demo.model.BlackBox import com.alibaba.testable.demo.model.BlackBox
import com.alibaba.testable.demo.model.Box
import com.alibaba.testable.demo.model.ColorBox import com.alibaba.testable.demo.model.ColorBox
import org.springframework.stereotype.Service
import sun.net.www.http.HttpClient import sun.net.www.http.HttpClient
import java.net.URL import java.net.URL
class DemoMock {
@Service
class DemoMockService {
/** /**
* method with new operation * method with new operation

View File

@ -1,10 +1,6 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import org.springframework.stereotype.Service class DemoPrivateAccess {
@Service
class DemoPrivateAccessService {
private var count = 0 private var count = 0

View File

@ -1,13 +0,0 @@
package com.alibaba.testable.demo
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest
class DemoApplicationTests {
@Test
fun contextLoads() {
}
}

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.core.annotation.TestableMock import com.alibaba.testable.core.annotation.TestableMock
import com.alibaba.testable.core.matcher.InvokeVerifier import com.alibaba.testable.core.matcher.InvokeVerifier
@ -8,7 +8,7 @@ import com.alibaba.testable.demo.model.Color
import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
internal class DemoInheritServiceTest { internal class DemoInheritTest {
@TestableMock(targetMethod = "put") @TestableMock(targetMethod = "put")
private fun put_into_box(self: Box, something: String) { private fun put_into_box(self: Box, something: String) {
@ -40,46 +40,46 @@ internal class DemoInheritServiceTest {
return "color_from_blackbox" return "color_from_blackbox"
} }
private val inheritService = DemoInheritService() private val demoInherit = DemoInherit()
@Test @Test
fun should_able_to_mock_call_sub_object_method_by_parent_object() { fun should_able_to_mock_call_sub_object_method_by_parent_object() {
val box = inheritService.putIntoBox() as BlackBox val box = demoInherit.putIntoBox() as BlackBox
InvokeVerifier.verify("put_into_box").withTimes(1) InvokeVerifier.verify("put_into_box").withTimes(1)
Assertions.assertEquals("put_data_into_box", box.get()) Assertions.assertEquals("put_data_into_box", box.get())
} }
@Test @Test
fun should_able_to_mock_call_sub_object_method_by_sub_object() { fun should_able_to_mock_call_sub_object_method_by_sub_object() {
val box = inheritService.putIntoBlackBox() val box = demoInherit.putIntoBlackBox()
InvokeVerifier.verify("put_into_blackbox").withTimes(1) InvokeVerifier.verify("put_into_blackbox").withTimes(1)
Assertions.assertEquals("put_data_into_blackbox", box.get()) Assertions.assertEquals("put_data_into_blackbox", box.get())
} }
@Test @Test
fun should_able_to_mock_call_parent_object_method_by_parent_object() { fun should_able_to_mock_call_parent_object_method_by_parent_object() {
val content = inheritService.fromBox val content = demoInherit.fromBox
InvokeVerifier.verify("get_from_box").withTimes(1) InvokeVerifier.verify("get_from_box").withTimes(1)
Assertions.assertEquals("get_from_box", content) Assertions.assertEquals("get_from_box", content)
} }
@Test @Test
fun should_able_to_mock_call_parent_object_method_by_sub_object() { fun should_able_to_mock_call_parent_object_method_by_sub_object() {
val content = inheritService.fromBlackBox val content = demoInherit.fromBlackBox
InvokeVerifier.verify("get_from_blackbox").withTimes(1) InvokeVerifier.verify("get_from_blackbox").withTimes(1)
Assertions.assertEquals("get_from_blackbox", content) Assertions.assertEquals("get_from_blackbox", content)
} }
@Test @Test
fun should_able_to_mock_call_interface_method_by_interface_object() { fun should_able_to_mock_call_interface_method_by_interface_object() {
val color = inheritService.colorViaColor val color = demoInherit.colorViaColor
InvokeVerifier.verify("get_color_from_color").withTimes(1) InvokeVerifier.verify("get_color_from_color").withTimes(1)
Assertions.assertEquals("color_from_color", color) Assertions.assertEquals("color_from_color", color)
} }
@Test @Test
fun should_able_to_mock_call_interface_method_by_sub_class_object() { fun should_able_to_mock_call_interface_method_by_sub_class_object() {
val color = inheritService.colorViaBox val color = demoInherit.colorViaBox
InvokeVerifier.verify("get_color_from_blackbox").withTimes(1) InvokeVerifier.verify("get_color_from_blackbox").withTimes(1)
Assertions.assertEquals("color_from_blackbox", color) Assertions.assertEquals("color_from_blackbox", color)
} }

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.core.annotation.TestableMock import com.alibaba.testable.core.annotation.TestableMock
import com.alibaba.testable.core.error.VerifyFailedError import com.alibaba.testable.core.error.VerifyFailedError
@ -9,33 +9,33 @@ import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
internal class DemoMatcherServiceTest { internal class DemoMatcherTest {
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private fun methodWithoutArgument(self: DemoMatcherService) { private fun methodWithoutArgument(self: DemoMatcher) {
} }
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private fun methodWithArguments(self: DemoMatcherService, a1: Any, a2: Any) { private fun methodWithArguments(self: DemoMatcher, a1: Any, a2: Any) {
} }
@TestableMock(targetMethod = "methodToBeMocked") @TestableMock(targetMethod = "methodToBeMocked")
private fun methodWithArrayArgument(self: DemoMatcherService, a: Array<Any>) { private fun methodWithArrayArgument(self: DemoMatcher, a: Array<Any>) {
} }
private val demo = DemoMatcherService() private val demoMatcher = DemoMatcher()
@Test @Test
fun should_match_no_argument() { fun should_match_no_argument() {
demo.callMethodWithoutArgument() demoMatcher.callMethodWithoutArgument()
InvokeVerifier.verify("methodWithoutArgument").withTimes(1) InvokeVerifier.verify("methodWithoutArgument").withTimes(1)
demo.callMethodWithoutArgument() demoMatcher.callMethodWithoutArgument()
InvokeVerifier.verify("methodWithoutArgument").withTimes(2) InvokeVerifier.verify("methodWithoutArgument").withTimes(2)
} }
@Test @Test
fun should_match_number_arguments() { fun should_match_number_arguments() {
demo.callMethodWithNumberArguments() demoMatcher.callMethodWithNumberArguments()
InvokeVerifier.verify("methodWithArguments").without(InvokeMatcher.anyString(), 2) InvokeVerifier.verify("methodWithArguments").without(InvokeMatcher.anyString(), 2)
InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.anyInt(), 2) InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.anyInt(), 2)
InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.anyLong(), InvokeMatcher.anyNumber()) InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.anyLong(), InvokeMatcher.anyNumber())
@ -49,7 +49,7 @@ internal class DemoMatcherServiceTest {
@Test @Test
fun should_match_string_arguments() { fun should_match_string_arguments() {
demo.callMethodWithStringArgument() demoMatcher.callMethodWithStringArgument()
InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.startsWith("he"), InvokeMatcher.endsWith("ld")) InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.startsWith("he"), InvokeMatcher.endsWith("ld"))
InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.contains("stab"), InvokeMatcher.matches("m.[cd]k")) InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.contains("stab"), InvokeMatcher.matches("m.[cd]k"))
InvokeVerifier.verify("methodWithArrayArgument").with(InvokeMatcher.anyArrayOf(String::class.java)) InvokeVerifier.verify("methodWithArrayArgument").with(InvokeMatcher.anyArrayOf(String::class.java))
@ -57,7 +57,7 @@ internal class DemoMatcherServiceTest {
@Test @Test
fun should_match_object_arguments() { fun should_match_object_arguments() {
demo.callMethodWithObjectArgument() demoMatcher.callMethodWithObjectArgument()
InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.any(BlackBox::class.java), InvokeMatcher.any(BlackBox::class.java)) InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.any(BlackBox::class.java), InvokeMatcher.any(BlackBox::class.java))
InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.nullable(BlackBox::class.java), InvokeMatcher.nullable(BlackBox::class.java)) InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.nullable(BlackBox::class.java), InvokeMatcher.nullable(BlackBox::class.java))
InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.isNull(), InvokeMatcher.notNull()) InvokeVerifier.verify("methodWithArguments").withInOrder(InvokeMatcher.isNull(), InvokeMatcher.notNull())
@ -65,10 +65,10 @@ internal class DemoMatcherServiceTest {
@Test @Test
fun should_match_with_times() { fun should_match_with_times() {
demo.callMethodWithNumberArguments() demoMatcher.callMethodWithNumberArguments()
InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.anyNumber(), InvokeMatcher.any()).times(3) InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.anyNumber(), InvokeMatcher.any()).times(3)
demo.callMethodWithNumberArguments() demoMatcher.callMethodWithNumberArguments()
var gotError = false var gotError = false
try { try {
InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.anyNumber(), InvokeMatcher.any()).times(4) InvokeVerifier.verify("methodWithArguments").with(InvokeMatcher.anyNumber(), InvokeMatcher.any()).times(4)

View File

@ -1,4 +1,4 @@
package com.alibaba.testable.demo.service package com.alibaba.testable.demo
import com.alibaba.testable.core.annotation.TestableMock import com.alibaba.testable.core.annotation.TestableMock
import com.alibaba.testable.core.matcher.InvokeVerifier.verify import com.alibaba.testable.core.matcher.InvokeVerifier.verify
@ -9,13 +9,13 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import java.util.concurrent.Executors import java.util.concurrent.Executors
internal class DemoMockServiceTest { internal class DemoMockTest {
@TestableMock(targetMethod = CONSTRUCTOR) @TestableMock(targetMethod = CONSTRUCTOR)
private fun createBlackBox(text: String) = BlackBox("mock_$text") private fun createBlackBox(text: String) = BlackBox("mock_$text")
@TestableMock @TestableMock
private fun innerFunc(self: DemoMockService, text: String) = "mock_$text" private fun innerFunc(self: DemoMock, text: String) = "mock_$text"
@TestableMock @TestableMock
private fun trim(self: BlackBox) = "trim_string" private fun trim(self: BlackBox) = "trim_string"
@ -37,7 +37,7 @@ internal class DemoMockServiceTest {
} }
@TestableMock @TestableMock
private fun callFromDifferentMethod(self: DemoMockService): String { private fun callFromDifferentMethod(self: DemoMock): String {
return if (TEST_CASE == "should_able_to_get_test_case_name") { return if (TEST_CASE == "should_able_to_get_test_case_name") {
"mock_special" "mock_special"
} else { } else {
@ -48,23 +48,23 @@ internal class DemoMockServiceTest {
} }
} }
private val demoService = DemoMockService() private val demoMock = DemoMock()
@Test @Test
fun should_able_to_mock_new_object() { fun should_able_to_mock_new_object() {
assertEquals("mock_something", demoService.newFunc()) assertEquals("mock_something", demoMock.newFunc())
verify("createBlackBox").with("something") verify("createBlackBox").with("something")
} }
@Test @Test
fun should_able_to_mock_member_method() { fun should_able_to_mock_member_method() {
assertEquals("{ \"res\": \"mock_hello\"}", demoService.outerFunc("hello")) assertEquals("{ \"res\": \"mock_hello\"}", demoMock.outerFunc("hello"))
verify("innerFunc").with("hello") verify("innerFunc").with("hello")
} }
@Test @Test
fun should_able_to_mock_common_method() { fun should_able_to_mock_common_method() {
assertEquals("trim_string__sub_string__false", demoService.commonFunc()) assertEquals("trim_string__sub_string__false", demoMock.commonFunc())
verify("trim").withTimes(1) verify("trim").withTimes(1)
verify("sub").withTimes(1) verify("sub").withTimes(1)
verify("startsWith").withTimes(1) verify("startsWith").withTimes(1)
@ -72,7 +72,7 @@ internal class DemoMockServiceTest {
@Test @Test
fun should_able_to_mock_static_method() { fun should_able_to_mock_static_method() {
assertEquals("White_not_secret_box", demoService.getBox().get()) assertEquals("White_not_secret_box", demoMock.getBox().get())
verify("secretBox").withTimes(1) verify("secretBox").withTimes(1)
verify("createBox").withTimes(1) verify("createBox").withTimes(1)
} }
@ -80,10 +80,10 @@ internal class DemoMockServiceTest {
@Test @Test
fun should_able_to_get_source_method_name() { fun should_able_to_get_source_method_name() {
// synchronous // synchronous
assertEquals("mock_one_mock_others", demoService.callerOne() + "_" + demoService.callerTwo()) assertEquals("mock_one_mock_others", demoMock.callerOne() + "_" + demoMock.callerTwo())
// asynchronous // asynchronous
assertEquals("mock_one_mock_others", Executors.newSingleThreadExecutor().submit<String> { assertEquals("mock_one_mock_others", Executors.newSingleThreadExecutor().submit<String> {
demoService.callerOne() + "_" + demoService.callerTwo() demoMock.callerOne() + "_" + demoMock.callerTwo()
}.get()) }.get())
verify("callFromDifferentMethod").withTimes(4) verify("callFromDifferentMethod").withTimes(4)
} }
@ -91,10 +91,10 @@ internal class DemoMockServiceTest {
@Test @Test
fun should_able_to_get_test_case_name() { fun should_able_to_get_test_case_name() {
// synchronous // synchronous
assertEquals("mock_special", demoService.callerOne()) assertEquals("mock_special", demoMock.callerOne())
// asynchronous // asynchronous
assertEquals("mock_special", Executors.newSingleThreadExecutor().submit<String> { assertEquals("mock_special", Executors.newSingleThreadExecutor().submit<String> {
demoService.callerOne() demoMock.callerOne()
}.get()) }.get())
verify("callFromDifferentMethod").withTimes(2) verify("callFromDifferentMethod").withTimes(2)
} }

View File

@ -0,0 +1,30 @@
package com.alibaba.testable.demo
import com.alibaba.testable.core.accessor.PrivateAccessor
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
internal class DemoPrivateAccessTest {
private val demoPrivateAccess = DemoPrivateAccess()
@Test
fun should_able_to_access_private_method() {
assertEquals("hello - 1", PrivateAccessor.invoke(demoPrivateAccess, "privateFunc", "hello", 1))
}
@Test
fun should_able_to_access_private_field() {
PrivateAccessor.set(demoPrivateAccess, "count", 3)
assertEquals("5", demoPrivateAccess.privateFieldAccessFunc())
assertEquals(5, PrivateAccessor.get(demoPrivateAccess, "count"))
}
@Test
fun should_able_to_update_final_field() {
PrivateAccessor.set(demoPrivateAccess, "pi", 4.13)
assertEquals(4.13, demoPrivateAccess.pi)
}
}

View File

@ -1,30 +0,0 @@
package com.alibaba.testable.demo.service
import com.alibaba.testable.core.accessor.PrivateAccessor
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
internal class DemoPrivateAccessServiceTest {
private val demoService = DemoPrivateAccessService()
@Test
fun should_able_to_access_private_method() {
assertEquals("hello - 1", PrivateAccessor.invoke(demoService, "privateFunc", "hello", 1))
}
@Test
fun should_able_to_access_private_field() {
PrivateAccessor.set(demoService, "count", 3)
assertEquals("5", demoService.privateFieldAccessFunc())
assertEquals(5, PrivateAccessor.get(demoService, "count"))
}
@Test
fun should_able_to_update_final_field() {
PrivateAccessor.set(demoService, "pi", 4.13)
assertEquals(4.13, demoService.pi)
}
}

View File

@ -13,7 +13,7 @@
因此不论被调用方法来自父类还是子类也不论子类是否覆写该方法Mock方法的首个参数类型都应该使用变量自身的接口或父类类型。 因此不论被调用方法来自父类还是子类也不论子类是否覆写该方法Mock方法的首个参数类型都应该使用变量自身的接口或父类类型。
参见Java和Kotlin示例中`DemoInheritServiceTest`测试类的用例。 参见Java和Kotlin示例中`DemoInheritTest`测试类的用例。
#### 3. `TestableMock`能否用于Android项目的测试 #### 3. `TestableMock`能否用于Android项目的测试

View File

@ -17,7 +17,7 @@ public test_case() {
除了这种简单校验以外TestableMock当前已经支持了多种**校验器**,以及能够模糊匹配参数特征的**匹配器**。 除了这种简单校验以外TestableMock当前已经支持了多种**校验器**,以及能够模糊匹配参数特征的**匹配器**。
在示例项目`java-demo`和`kotlin-demo`中的`DemoMatcherServiceTest`测试类详细展示了这些校验器和匹配器的用法。 在示例项目`java-demo`和`kotlin-demo`中的`DemoMatcherTest`测试类详细展示了这些校验器和匹配器的用法。
## 基本校验器 ## 基本校验器

View File

@ -53,7 +53,7 @@
若不希望看到IDE的语法错误提醒或是在基于JVM的非Java语言项目里譬如Kotlin语言也可以借助`PrivateAccessor`工具类来实现私有成员的访问。 若不希望看到IDE的语法错误提醒或是在基于JVM的非Java语言项目里譬如Kotlin语言也可以借助`PrivateAccessor`工具类来实现私有成员的访问。
效果见`java-demo`和`kotlin-demo`示例项目中`DemoPrivateAccessService`类的测试用例。 效果见`java-demo`和`kotlin-demo`示例项目中`DemoPrivateAccessTest`测试类的用例。
### Mock被测类的任意方法调用 ### Mock被测类的任意方法调用
@ -89,10 +89,10 @@ private String substring(String self, int i, int j) {
例如,被测类中有一个签名为`String innerFunc(String)`的私有方法,我们希望在测试的时候将它替换掉,则只需在测试类定义如下方法: 例如,被测类中有一个签名为`String innerFunc(String)`的私有方法,我们希望在测试的时候将它替换掉,则只需在测试类定义如下方法:
```java ```java
// 被测类型是`DemoMockService` // 被测类型是`DemoMock`
// 因此在定义Mock方法时在目标方法参数首位加一个类型为`DemoMockService`的参数(名字随意) // 因此在定义Mock方法时在目标方法参数首位加一个类型为`DemoMock`的参数(名字随意)
@TestableMock @TestableMock
private String innerFunc(DemoMockService self, String text) { private String innerFunc(DemoMock self, String text) {
return "mock_" + text; return "mock_" + text;
} }
``` ```

View File

@ -27,7 +27,7 @@ class SourceClassHandlerTest {
new InsnNode(ICONST_1), new InsnNode(ICONST_1),
new InsnNode(ICONST_2), new InsnNode(ICONST_2),
new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "substring", "(II)Ljava/lang/String;", false), new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "substring", "(II)Ljava/lang/String;", false),
new MethodInsnNode(INVOKESPECIAL, "com/alibaba/testable/demo/DemoServiceTest", "blackBox", "(Ljava/lang/String;)Lcom/alibaba/testable/demo/BlackBox;", false), new MethodInsnNode(INVOKESPECIAL, "com/alibaba/testable/demo/DemoTest", "blackBox", "(Ljava/lang/String;)Lcom/alibaba/testable/demo/BlackBox;", false),
new MethodInsnNode(INVOKEVIRTUAL, "com/alibaba/testable/demo/BlackBox", "callMe", "()Ljava/lang/String;", false), new MethodInsnNode(INVOKEVIRTUAL, "com/alibaba/testable/demo/BlackBox", "callMe", "()Ljava/lang/String;", false),
new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z", false) new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z", false)
}; };