deployed behaves like a singleton. It will look if there is already an instance of the contract deployed to the blockchain via
deployer.deploy. The information about which contract has which address on which network is stored in the build folder.
new will always create a new instance.
It depends on your testcase, but I prefer not using
deployed in unit tests in order to avoid side-effects and better isolate the unit tests.
Some unit tests will require instantiating multiple instances of a smart contract and deploying each of them. In this case,
new is the only option as
deployed simply retrieves the same already-deployed contract each time.