Search code examples
testingclojureleiningenmidje

FileNotFound exception while running Midje tests


I have a Leiningen project which uses Midje library for testing. Howerver I am not able to run any tests, in case of lein test I get

java.io.FileNotFoundException: Could not locate midje/sweet__init.class or midje/sweet.clj on classpath

Or alternatively with lein midje test I get

java.io.FileNotFoundException: Could not locate midje/util/ecosystem__init.class or midje/util/ecosystem.clj on classpath

So I guess this is because I have incorrectly defined dev profile with dependencies but I am not sure where the real problem is.

As a bonus, I also cannot get environ working, I am always getting nil which I want to pull some property out of the env map (this might be the same issue as well).

My project.clj

(defproject
  project
  "0.1.0-SNAPSHOT"
  :dependencies
   [[org.clojure/clojure "1.8.0"]
   [environ "1.1.0"]
   ;; other deps, midje is not there
   :repl-options
      {:init-ns mailing.repl}
   :jvm-opts
      ["-server"]
   :plugins
      [[lein-ring "0.8.13"]
       [lein-environ "1.0.0"]
       [lein-ancient "0.5.5"]
       [migratus-lein "0.4.2"]] 
   :ring
     {:handler mailing.handler/app,
   :init mailing.handler/init,
   :destroy mailing.handler/destroy}
   :profiles
      {:uberjar {:omit-source true, :env {:production true}, :aot :all},
       :production
      {:ring {:open-browser? false, :stacktraces? false, :auto-reload? false}},
      {:dev
        {:env 
          {:db-user "user" 
           :db-password "psswd"
           :db-classname "org.postgresql.Driver"
           :db-subprotocol "postgresql"
           :db-subname "//localhost/mailer"}}}
      {:dependencies
[[ring-mock "0.1.5"]
 [ring/ring-devel "1.3.1"]
 [midje "1.6.3"]],
:env {:dev true}}}
  :migratus {
         :store :database
         :migration-dir "migrations"
         :db {
              :classname "org.postgresql.Driver"
              :subprotocol "postgresql"
              :subname "//localhost/mailer"
              :user "usr"
              :password "psswd"}}
;; refer to user and psswd from project
:min-lein-version "2.0.0")

Solution

  • I've not tried this, but the structure doesn't appear quite right. I think it should be something like:

    (defproject project "0.1.0-SNAPSHOT"
      :dependencies [[org.clojure/clojure "1.8.0"]
                     [environ "1.1.0"]]
      ;; other deps, midje is not there
      :repl-options {:init-ns mailing.repl}
      :jvm-opts ["-server"]
      :plugins [[lein-ring "0.8.13"]
                [lein-environ "1.0.0"]
                [lein-ancient "0.5.5"]
                [migratus-lein "0.4.2"]]
      :ring {:handler mailing.handler/app
             :init mailing.handler/init
             :destroy mailing.handler/destroy}
      :profiles {:uberjar {:omit-source true
                           :env {:production true}
                           :aot :all}
                 :production {:ring {:open-browser? false
                                     :stacktraces? false
                                     :auto-reload? false}}
                 :dev {:env {:db-user "user"
                             :db-password "psswd"
                             :db-classname "org.postgresql.Driver"
                             :db-subprotocol "postgresql"
                             :db-subname "//localhost/mailer"
                             :dev true}
                       :dependencies [[ring-mock "0.1.5"]
                                      [ring/ring-devel "1.3.1"]
                                      [midje "1.6.3"]]}}
      :migratus {:store :database
                 :migration-dir "migrations"
                 :db {:classname "org.postgresql.Driver"
                      :subprotocol "postgresql"
                      :subname "//localhost/mailer"
                      :user "usr"
                      :password "psswd"}}
    
       ;; refer to user and psswd from project
       :min-lein-version "2.0.0")
    

    It looks like your :dependecies block near the top is malformed (no closing ]), and the development dependencies were not actually associated with the :dev profile. I wasn't sure if :migratus belonged with the :dev profile or not, so it's outside of it in the example above.

    FWIW, the sample project file in Leiningen's repo is a helpful resource.