我正在与:
- Spring框架4.3.2
- 方面J 1.8.9
- JUnit
- Gradle
该项目基于多模块。
In src/main/java
(main) 我有一些@Aspect
课程和他们按照预期的方式工作。我可以通过运行时和测试来确认
现在我需要 JUnit 通过日志显示@Test
执行的方法名
因此在src/test/java
(test)我有以下内容:
class TestPointcut {
@Pointcut("execution(@org.junit.Test * *())")
public void testPointcut(){}
}
@Aspect
@Component
public class TestAspect {
private static final Logger logger = LoggerFactory.getLogger(TestAspect.class.getSimpleName());
@Before(value="TestPointcut.testPointcut()")
public void beforeAdviceTest(JoinPoint joinPoint){
logger.info("beforeAdviceTest - Test: {} - @Test: {}", joinPoint.getTarget().getClass().getName(), joinPoint.getSignature().getName() );
}
}
观察第二节课有@Aspect
and @Component
因此它被Spring认可
Note: 我可以确认如果我写错了@Pointcut
语法或表达式出现错误。
问题是当我执行我的@Test
方法,对于TestAspect
类@Before
建议永远不会起作用。
我在谷歌做了一项研究,我发现@Pointcut("execution(@org.junit.Test * *())")
模式是正确的。
即使我使用更明确的方式,例如:@Pointcut(value="execution(public void com.manuel.jordan.controller.persona.*Test.*Test())")
, 这是行不通的。
考虑我有以下内容Gradle
project(':web-27-rest') {
description 'Web - Rest'
dependencies {
compile project(':web-27-service-api')
testRuntime project(':web-27-aop')
testRuntime project(':web-27-aop').sourceSets.test.output
缺少什么或有什么问题?
Alpha:
一种测试类是:
- 服务器端与
@Parameters
and @ClassRule
+ @Rule
所以:
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class})
@Transactional
public class PersonaServiceImplTest {
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE= new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@Autowired
private PersonaService personaServiceImpl;
...
@Parameters
public static Collection<Persona[]> data() {
.....
});
}
...
@Test
@Sql(scripts={"classpath:....-script.sql"})
public void saveOneTest(){
....
}
其他有:
- Web side working with (
@WebAppConfiguration
) and either:
- with
@Parameters
and @ClassRule
+ @Rule
- without
@Parameters
and @ClassRule
+ @Rule
因此(在第二种方法下面):
@Transactional
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})
public class PersonaDeleteOneControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
private ResultActions resultActions;
...
@BeforeClass
public static void setUp_(){
...
}
@Before
public void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void deleteOneHtmlGetTest() throws Exception {