1

I use Spring Roo and I rely on Roo's data on demand for my integration tests.

I recently realized that the very same integration tests that run smoothly in Eclipse break when I run them from Maven.

The problem seems to come from Spring Roo's data on demand. For instance I get errors such as...

testFindPlisByMultiFieldWithNothingSet(trc.suivi.core.repository.PliRepositoryTest): expected:<10> but was:<0>

...for the following test...

@Test
public void testFindPlisByMultiFieldWithNothingSet() {
    PliDataOnDemand dod = new PliDataOnDemand();
    dod.init();
    PliQueryInfo pliQueryInfo = new PliQueryInfo();
    List<Pli> plis = pliRepository.findPlisByMultiField(pliQueryInfo, null, null, null, null);
    assertEquals(10, plis.size());
}

...indicating that dod.init() does not populate my in-memory database...

FYI, PliDataOnDemand is a data on demand class for one of our entities called Pli.

Can anyone please help?

EDIT:

From the command line: I ran "mvn test"

From eclipse: I just ran the test from the eclipse menu

Maven version: 3.0.4

EDIT 2:

Output from aspectJ maven plugin:

[INFO] 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java:8) is annotated with @Component type annotation from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:26)
[INFO] 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java:8) is annotated with @Configurable type annotation from 'trc.suivi.core.domain.PliDataOnDemand_Roo_Configurable' (PliDataOnDemand_Roo_Configurable.aj:11)
[INFO] Extending interface set for type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) to include 'org.springframework.beans.factory.aspectj.ConfigurableObject' (AnnotationBeanConfigurerAspect.aj)
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped field from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'java.util.Random trc.suivi.core.domain.PliDataOnDemand.rnd')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped field from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'java.util.List<trc.suivi.core.domain.Pli> trc.suivi.core.domain.PliDataOnDemand.data')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped field from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'trc.suivi.core.domain.UtilisateurDataOnDemand trc.suivi.core.domain.PliDataOnDemand.utilisateurDataOnDemand')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'trc.suivi.core.domain.Pli trc.suivi.core.domain.PliDataOnDemand.getNewTransientPli(int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setDateAnnulation(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setDateCreation(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setDateModification(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setDateReception(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setFDV(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setIdentifiant(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setNbPlisFDVEstime(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setNumeroPli(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setPaiement(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setStatut(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.setTypePli(trc.suivi.core.domain.Pli, int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'trc.suivi.core.domain.Pli trc.suivi.core.domain.PliDataOnDemand.getSpecificPli(int)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'trc.suivi.core.domain.Pli trc.suivi.core.domain.PliDataOnDemand.getRandomPli()')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'boolean trc.suivi.core.domain.PliDataOnDemand.modifyPli(trc.suivi.core.domain.Pli)')
[INFO] Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java) has intertyped method from 'trc.suivi.core.domain.PliDataOnDemand_Roo_DataOnDemand' (PliDataOnDemand_Roo_DataOnDemand.aj:'void trc.suivi.core.domain.PliDataOnDemand.init()')
[INFO] Join point 'initialization(void org.springframework.beans.factory.aspectj.ConfigurableObject.<init>())' in Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java:8) advised by before advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.1.RELEASE.jar!AbstractDependencyInjectionAspect.class:78(from AbstractDependencyInjectionAspect.aj)) [with runtime test]
[INFO] Join point 'initialization(void org.springframework.beans.factory.aspectj.ConfigurableObject.<init>())' in Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java:8) advised by afterReturning advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.1.RELEASE.jar!AbstractDependencyInjectionAspect.class:87(from AbstractDependencyInjectionAspect.aj)) [with runtime test]
[INFO] Join point 'initialization(void trc.suivi.core.domain.PliDataOnDemand.<init>())' in Type 'trc.suivi.core.domain.PliDataOnDemand' (PliDataOnDemand.java:8) advised by afterReturning advice from 'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect' (spring-aspects-3.1.1.RELEASE.jar!AbstractDependencyInjectionAspect.class:87(from AbstractDependencyInjectionAspect.aj)) [with runtime test]

EDIT 3:

I get this:

 testFindPlisByMultiFieldWithIdentifiantSet(trc.suivi.core.repository.PliRepositoryTest): Unable to find trc.suivi.core.domain.Utilisateur with id 1; nested exception is javax.persistence.EntityNotFoundException: Unable to find trc.suivi.core.domain.Utilisateur with id 1

for the following test:

@Test
public void testFindPlisByMultiFieldWithIdentifiantSet() {
    PliDataOnDemand dod = new PliDataOnDemand();
    Pli pli = dod.getSpecificPli(0);
    pli.setIdentifiant("theIdentifiant");
    pliRepository.save(pli);
    PliQueryInfo pliQueryInfo = new PliQueryInfo();
    pliQueryInfo.setIdentifiant("theIdentifiant");
    List<Pli> plis = pliRepository.findPlisByMultiField(pliQueryInfo, null, null, "identifiant", "desc");
    assertEquals(1, plis.size());
}
balteo
  • 23,602
  • 63
  • 219
  • 412
  • Could you post the Maven versions and the arguments that you used when running it within Eclipse and elsewhere? =) – bhagyas Oct 25 '12 at 05:14

2 Answers2

5

This is how to expose dependency jars to maven and aspectj weaver:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.7.3</version>
    </dependency>

     <dependency>
      <groupId>org.agroup</groupId>
      <artifactId>to-weave</artifactId>
      <version>1.0</version>
    </dependency>

    <dependency>
      <groupId>org.anothergroup</groupId>
      <artifactId>gen</artifactId>
      <version>1.0</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.5</version>
        <configuration>
          <weaveDependencies>
            <weaveDependency>
              <groupId>org.agroup</groupId>
              <artifactId>to-weave</artifactId>
            </weaveDependency>
            <weaveDependency>
              <groupId>org.anothergroup</groupId>
              <artifactId>gen</artifactId>
            </weaveDependency>
          </weaveDependencies>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

Source: aspectj-maven-plugin

Efthymis
  • 1,326
  • 11
  • 13
SergeyB
  • 9,478
  • 4
  • 33
  • 47
  • This solution fixed my issue. I linked here via: http://stackoverflow.com/questions/16502470/why-do-i-get-a-not-exposed-to-the-weaver-warnings-when-making-my-spring-project – icfantv Jan 30 '14 at 19:46
3

Why you are calling dod.init() by yourself? You could autowire data on demand. And don't forget annotate your test class with @RunWith(SpringJUnit4ClassRunner.class).

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
@Transactional
public class PliTest {

  @Autowired
  private PliDataOnDemand dod;

  // your tests
}

Update
Seeing your maven output I would say there is something wrong with aspect weaving. From your output has intertyped method from and this affected type is not exposed to the weaver.

Update 2
Read about Managing multiple projects from http://www.eclipse.org/articles/Article-Introducing-AJDT/article.html. Try to configure aspectj-maven-plugin using weaveDependencies or weaveDirectories parameter http://mojo.codehaus.org/aspectj-maven-plugin/compile-mojo.html#weaveDependencies.

Aleksandr M
  • 24,264
  • 12
  • 69
  • 143
  • Hello Alzksandr. I am calling `dod.init()` because it is required if you don't call methods such as `dod.getSpecificPli(0)`. Otherwise, the domain model is not populated. I tried the solution you suggested: it does not work either. – balteo Oct 29 '12 at 12:13
  • 1
    Hmm... Have you changed something in your `pom.xml`? Especially inside ``. Maybe some aspects are not getting weaved. – Aleksandr M Oct 29 '12 at 12:57
  • Hi! Good point. I hadn't thought about that. It seems the aspects are correctly weaved. See edit. – balteo Oct 30 '12 at 10:55
  • Try to persist something inside one of your test method and see if any exception comes up. Also I noticed that your test method not throwing exceptions so add `throws Exception` to it. – Aleksandr M Oct 30 '12 at 11:06
  • `Utilisateur` is one other Entity in my domain model. – balteo Oct 30 '12 at 11:51
  • Seems like your test depends on some other test. See if you can run ONLY this Pli test in Eclipse. – Aleksandr M Oct 30 '12 at 11:54
  • JUnit tests run from Eclipse pass successfully. One other thing to mention: `Utilisateur` is the first entity to be populated by DOD and DOD fails there.... – balteo Oct 30 '12 at 12:02
  • I had not seen your edit: sorry. Anyway, I am not sure how to interpret those aspectj warnings... I have added the `aspectJ` tag to my post. – balteo Oct 30 '12 at 16:10