我有一个测试类:
@RunWith(EasyMockRunner.class)
public class TestClass{
@TestSubject
private AdDataCollector collector = new DefaultAdDataCollector();
...
@Test
public void check() {
.. some logic ...
expect().andReturn();
expect().andReturn();
replay(...);
Map<,> result = collector.collect(...);
verify(...);
assertTrue(...)
}
这样的方面:
@Aspect
public class SafeUriInterceptor {
@Autowired
private UriConverterUtil uriConverterUtil;
@Around("execution(public * *(..)) && @annotation(SafeUrl) && args(param)")
public void proceedMethodWithSafeUrl(ProceedingJoinPoint joinPoint, String param) throws Throwable {
String encodedValue = uriConverterUtil.encodeUriString(param);
joinPoint.proceed(new Object[] { encodedValue });
}
@Around("execution(public * *(..)) && @annotation(SafeUrl) && args(uriList)")
public void proceedMethodWithSafeUrlList(ProceedingJoinPoint joinPoint, List<String> uriList) throws Throwable {
List<String> encodedUriStrList = uriList != null
? uriList.stream().map(uriConverterUtil::encodeUriString).collect(Collectors.toList())
: null;
joinPoint.proceed(new Object[] { encodedUriStrList });
}
}
在value.collect(...)
内的测试类中,此方面执行操作。这个方法做了很多事情,它需要安全的URL,因此它使用方面。简而言之,方法的概念是:
public Map<,> collect() {
Map<String,Apple> map = new HashMap<>();
...
String unsafeUrl = "http://";
apple.setValue(unsafeUrl);
map.put(key, apple);
...
}
在方法apple.setValue(unsafeUrl)
方面执行(我不完全理解为什么在测试中调用它)。
我得到NullPointerException,因为UriConverterUtil
为空。
我试图模仿UriConverterUtil
,但这并没有帮助。我嘲笑的对象和方面SafeUriInterceptor
内的对象是不同的对象。我仍然得到NullPointerException。
如果在没有方面的情况下调用内部测试方法,我该怎么办?或者我如何在方面UriConverterUtil
内模仿SafeUriInterceptor
?还是有其他解决方案吗?
这是我的maven依赖,aspectj-maven-plugin
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.11</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<weaveDependencies>
<weaveDependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
</weaveDependency>
</weaveDependencies>
<aspectLibraries>
<aspectLibrary>
<groupId>...</groupId>
<artifactId>...</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
可能的解决方案
因此,我可以猜测的一个解决方案是检查:uriConverterUtil
是否为空。在所有测试中它都是null。如果它为null我可以执行没有uri修改的方法。